设计模式之简单工厂模式

30 篇文章 2 订阅
23 篇文章 1 订阅


前言

        软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。--来自百度百科。
        既然设计模式有那么多好处,我们在做程序设计的时候,就应该充分考虑自己需要解决的问题是否有一个设计模式与之相似,尽量使用现有的解决方案来设计程序,避免代码重复或自己考虑不足导致设计缺陷。
        为了系统性的学习设计模式相关知识,同时也作为一种学习记录,从这篇博文开始,将记录我学习设计模式的一个足迹。设计模式来来回回看了几次,但是都只留在脑海里,时间久了,就会遗忘,通过博客来记录学习到的东西,即使以后忘了,还可以回来再看看自己曾经学习过的东西,快速的重新掌握这些知识。
        设计模式这一系列的博文,我计划采用C语言和C++语言两种代码来展示。C语言是新学习的语言,C++是老本行,虽然C++是C语言的超集,但是纯C语言确实和C++相差太多,习惯了C++,再写纯C代码,有点痛苦~

一、什么是简单工厂模式?

        简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。-- 来自百度百科
        当我们需要生成一系列的对象时,我们应该首先想到的是:我们能不能使用工厂模式来解决对象的生成?例如在使用Qt开发控件的时候,需要生成一系列的控件,每个控件都继承自QWidet,我们就可以使用简单工厂模式来生成这些对象。

二、C++实现简单工厂模式

1.设计思想

        简单工厂模式使用C++语言实现,主要使用了C++类的继承特性。在C++当中,子类和基类的关系是"is a"的关系,子类对象的指针可以赋值给父类对象指针,我们在使用这个基类对象指针就可以操作这个新创建的类对象。这里的例子是最简单的例子,实际开发的时候,工厂类最好使用单例模式,一个工厂生产各类产品。当然不用单例也可以,不同工厂生产不同系列的产品。一系列产品映射到C++,就是不同基类,同一基类代表同一个系列。

2.代码实现

#include<string>
using namespace std;
class base_t {
public:
	base_t() {
		product_name = "base";
		product_id = 0;
	}
public:
	string product_name;
	int product_id;
};

class product_a_t : public base_t {
public:
	product_a_t() {
		product_name = "a";
		product_id = 1;
	}
};

class product_b_t : public base_t {
public:
	product_b_t() {
		product_name = "b";
		product_id = 2;
	}
};

class factory_t {
public:
	base_t* create_product(int product_id) {
		switch (product_id) {
		case 1:
			return new product_a_t;
		case 2:
			return new product_b_t;
		default:
			return NULL;
		}
	}
};

//在需要创建对象的地方,我们可以这样用
factory_t my_factory;
base_t* product_a_obj = my_factory.create_product(1);//product_a_obj->product_name == "a";
base_t* product_b_obj = my_factory.create_product(2);//product_b_obj->product_name == "b";

三、C语言实现简单工厂模式

1.设计思想

        与C++不同,纯C语言是没有类的,也就没有继承特性。它是面向过程的,面向接口的,所以,工厂模式的实现主要依赖接口来实现。

2.代码实现

struct product_t {
	char* name[50];
	int product_id;
};

product_t* create_product(int32_t product_id) {
	switch (product_id) {
	case 1:
		product_t * product_a = (product_t*)malloc(sizeof(product_t));
		memset(product_a, 0, sizeof(product_t));
		memcpy(product_a->name, "a", strlen("a"));
		product_a->product_id = 1;
		
		return product_a;
	case 2:
		product_t * product_b = (product_t*)malloc(sizeof(product_t));
		memset(product_b, 0, sizeof(product_t));
		memcpy(product_b->name, "b", strlen("b"));
		product_b->product_id = 2;

		return product_b;
	default:
		return NULL;
	}
}

// 使用的时候,直接调用接口create_product即可:
product_t* product_a =  create_product(1)

总结

        简单工厂模式是最简单的一种工厂模式,它的目的是使用一个接口来实现对象的生成,使用者不需要知道对象的创建方法,创建过程,只需要传递正确的参数给对象生成接口即可,使用简单。简单工厂模式的缺点就是,每新增一种产品,都得修改工厂类或接口的对象产生代码,扩展性不太好,比较适合创建少量类型对象的时候使用,如果种类非常多,工厂接口将变得非常臃肿。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值