工厂方法模式

工厂方法模式

一、简介

     工厂方法模式对简单工厂模式中的工厂类进行了抽象,工厂类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() = 011 };
 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 }

如果要添加一个乘法操作,只需增加相应的乘法工厂并在客户端实例化即可。即实现了单一功能原则,也符合开闭原则。

原文地址:https://www.cnblogs.com/SnailProgramer/p/4213644.html