前言
软件设计模式(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);