工厂方法模式
工厂方法模式
一、简介
工厂方法模式对简单工厂模式中的工厂类进行了抽象,工厂类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 COperation 18 { 19 public: 20 virtual double GetResult() 21 { 22 return m_nFirst - m_nSecond; 23 } 24 }; 25 26 //简单工厂模式的工厂类 27 class CCalculatorFactory 28 { 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 CCalculatorFactory 54 { 55 public: 56 virtual COperation* Create() = 0; 57 }; 58 59 class AddFactory : public CCalculatorFactory 60 { 61 62 public: 63 COperation* Create() 64 { 65 return new AddOperation; 66 } 67 }; 68 69 class SubFactory : public CCalculatorFactory 70 { 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 }
如果要添加一个乘法操作,只需增加相应的乘法工厂并在客户端实例化即可。即实现了单一功能原则,也符合开闭原则。