首页 > 代码库 > 工厂方法模式

工厂方法模式

工厂方法模式

一、简介

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

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

 

工厂方法模式