参考:三种工厂模式的C++实现
1.简单工厂模式
要理解这个模式,需要预设一个条件,就是子类(XSLsoap,SFJsoap)的实现,与main中去调用factory的是2个人。。
抽象出一个肥皂工厂(soapBase)父类,然后具体的子类(XSLsoap,SFJsoap)去继承父类。。。在通过具体工厂类(Factory)去写代码的地方进行调用。
优点:相比直接去创建子类(XSLsoap,SFJsoap),调用Factory去创建子类,比较解耦,能够比较少的去改变main中代码。
缺点:当添加子类,Factory需要修改。。很繁琐。。而且本质上是对switch--case的封装,感觉意义不大。。感觉不是特别的好。
// 简单工厂模式
// 通过factory去创建不同的具体类---本质上还是switch,case
// 缺点很明显--添加一个子类就需要修改soapBase,不符合开闭原则
#include "iostream"
using namespace std;
enum Product {SFJ,XSL};
class soapBase {
public:
virtual ~soapBase() {};
virtual void show() = 0;
};
class SFJsoap:public soapBase {
public:
void show() {cout << "SFJ" << endl;}
};
class XSLsoap:public soapBase {
public:
void show() {cout << "XSL" << endl;}
};
class Factory {
public:
soapBase* createSoap(Product type) {
switch (type)
{
case SFJ:
return new SFJsoap();
break;
case XSL:
return new XSLsoap();
break;
}
}
};
int main()
{
Factory factory;
soapBase* soap1 = factory.createSoap(SFJ);
soap1->show();
soapBase* soap2 = factory.createSoap(XSL);
soap2->show();
}
2.工厂方法模式
这个模式感觉就是抽象工厂(abstractfactory)定义一个创建产品函数:这个函数返回抽象香皂类(soapbase* createSoap(); )。
而调用,则是通过多态创建具体的工厂类,而去调用复写的接口,把多态运用的淋漓尽致。。
// 工厂方法模式
// 工厂方法模式
#include <iostream>
using namespace std;
class soapBase
{
public:
virtual ~soapBase(){};
virtual void show() = 0;
};
class NASSoap:public soapBase
{
public:
void show() {cout<<"NAS Soap!"<<endl;}
};
class abstractFactory {
public:
virtual soapBase * creatSoap() = 0;
};
class FactoryNASSoap : public abstractFactory
{
public:
virtual soapBase * creatSoap()
{
return new NASSoap();
}
};
int main()
{
abstractFactory* factory = new FactoryNASSoap();
soapBase* soap = factory->creatSoap();
soap->show();
return 0;
}