zoukankan      html  css  js  c++  java
  • 工厂方法模式

    工厂方法模式

    一、简介

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

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

  • 相关阅读:
    nodejs简易代理服务器
    request发送json-rpc请求
    nodejs使用sequelize操作mysql实例
    nodejs添加jsonwebtoken验证
    .net core下使用DbProviderFactories.GetFactory("")无法创建工厂的解决方案
    .net core 后台如何生成html字符串到前台_后台html字符串在前台显示编码状态
    .net core入门-跨域访问配置
    .net core入门-项目启动时报错:HTTP Error 502.5
    .net core项目启动时报_未处理Socket异常(以一种访问权限不允许的方式做了一个访问套接字的尝试。)
    winform批量更新数据_长时间的执行会导致界面卡死
  • 原文地址:https://www.cnblogs.com/SnailProgramer/p/4213644.html
Copyright © 2011-2022 走看看