首页 > 代码库 > 工厂方法模式
工厂方法模式
工厂方法模式
一、简介
工厂方法模式对简单工厂模式中的工厂类进行了抽象,工厂类factory不再负责具体产品的生产,而是将其推迟到子类中。
二、角色及其职责
// 简单工厂模式
工厂(Creator)角色
简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
// 工厂方法模式
抽象工厂(Creator)角色
工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
具体产品(Concrete Product)角色
这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。
// 公共部分
抽象产品(Product)角色
简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色
是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
三、优缺点
优点:
1. 良好的封装性,代码结构清晰。
2. 扩展性好,要增加新的产品,只需添加新的产品类和产品的工厂类。
3. 连接并行的类层次结构
4. 屏蔽产品类,产品类的实现如何变化,调用者都不需要关系,只需要关系产品的接口。
5. 典型的解耦框架,高层模块只需知道产品的抽象类。
四、使用场景
五、源码
借鉴《大话设计模式实现(C++版)》,在简单工厂模式上做修改,实现工厂方法模式。
色部分为简单工厂模式,作为对照
色部分为工厂方法模式。
1 class COperation 2 { 3 public: 4 int m_nFirst; 5 int m_nSecond; 6 virtual double GetResult() = 0;11 }; 7 //加法 8 class AddOperation : public COperation 9 {10 public:11 virtual double GetResult()12 {13 return m_nFirst + m_nSecond;14 }15 };16 //减法17 class SubOperation : public COperation18 {19 public:20 virtual double GetResult()21 {22 return m_nFirst - m_nSecond;23 }24 };25 26 //简单工厂模式的工厂类27 class CCalculatorFactory28 {29 public:30 static COperation* Create(char cOperator);31 };32 33 COperation* CCalculatorFactory::Create(char cOperator)34 {35 COperation *oper;36 37 switch (cOperator)38 {39 case ‘+‘:40 oper=new AddOperation();41 break;42 case ‘-‘:43 oper=new SubOperation();44 break;45 default:46 oper=new AddOperation();47 break;48 }49 return oper;50 }51 52 //工厂模式的工厂类53 class CCalculatorFactory54 {55 public:56 virtual COperation* Create() = 0;57 };58 59 class AddFactory : public CCalculatorFactory60 {61 62 public:63 COperation* Create()64 {65 return new AddOperation;66 }67 };68 69 class SubFactory : public CCalculatorFactory70 {71 public:72 virtual COperation* Create()73 {74 return new SubOperation;75 }76 };77 78 客户端79 int main()80 {81 int a,b;82 cin>>a>>b;83 // 简单工厂模式 84 COperation * op = CCalculatorFactory::Create(‘-‘);85 86 // 工厂方法模式87 CCalculatorFactory* p = new AddFactory;88 COperation* opr = p->Create();89 90 opr->m_nFirst=a;91 opr->m_nSecond=b;92 cout<<op->GetResult()<<endl;93 return 0;94 }
如果要添加一个乘法操作,只需增加相应的乘法工厂并在客户端实例化即可。即实现了单一功能原则,也符合开闭原则。
工厂方法模式