简单工厂模式(C++)
前言
简单工厂的模式在程序编写过程中比较常用,很多人有意无意的会用到这种方法,其实就是定义接口,然后通过继承的方式实现具体的功能,最后在一个工厂类中,根据参数进入到各个分支中获取接口类的指针对象,从而实现创建。
另外,工厂模式的创建,如果语言本身支持反射
的话,switch的分支判断可以改成反射方法实现,这样会更加简单明了(C++本身不支持反射机制,Java原生支持,当然,QT和MFC的框架是支持这种反射机制)
简单工厂模式
1. 概要
2. 实现方法
/******* 简单工厂的例子 ********/
#ifndef SIMPLE_FACTORY_H
#define SIMPLE_FACTORY_H
#include <iostream>
using namespace std;
//定义产品类型信息
typedef enum{
Tank_Type_A,
Tank_Type_B,
Tank_Type_Other
}Tank_Type;
//抽象产品类
class Tank
{
public:
virtual const string & type() = 0;
virtual ~Tank(){ }
};
//具体产品类A
class Tank_A : public Tank{
public:
Tank_A():Tank(),m_strType("Tank_A"){ }
const string & type() override{
cout << m_strType.data() << endl;
return m_strType;
}
private:
string m_strType;
};
//具体产品类B
class Tank_B : public Tank{
public:
Tank_B():Tank(),m_strType("Tank_B"){ }
const string & type() override{
cout << m_strType.data() << endl;
return m_strType;
}
private:
string m_strType;
};
//工厂类
class Tank_Factory
{
public:
//根据产品信息创建具体的产品类实例,返回一个抽象产品类
Tank* createTank(Tank_Type type){
switch(type){
case Tank_Type_A:
return new Tank_A();
break;
case Tank_Type_B:
return new Tank_B();
break;
default:
return nullptr;
}
}
};
//简单工厂例子
class Simple_Factory
{
public:
Simple_Factory();
//简单工厂模式的应用例子
void run_example(){
cout << "***** Simple_Factory *****" << endl;
Tank_Factory *factory = new Tank_Factory();//创建工厂
Tank *tank_A = factory->createTank(Tank_Type_A);//实例化对象A
Tank *tank_B = factory->createTank(Tank_Type_B);//实例化对象B
tank_A->type();
tank_B->type();
delete tank_A;
tank_A = nullptr;
delete tank_B;
tank_B = nullptr;
delete factory;
factory = nullptr;
}
};
#endif // SIMPLE_FACTORY_H
3. 设计模式总结
总之,简单工厂的模式让创建过程推迟到子类中,但是需要注意的是,简单工厂突出的是简单
二字,如果是简单的对象的话,直接new一个对象即可,此时如果再用简单工厂的话,会增加一个工厂类,从而让整个过程变得不简单
。
另外,C++中的一些设计模式的总结导航,可以参考这里(设计模式总结)。
参考资料
[1] https://www.runoob.com/design-pattern/factory-pattern.html
[2] https://www.cnblogs.com/chengjundu/p/8473564.html