zoukankan      html  css  js  c++  java
  • (创建型模式)Factory——简单工厂模式

    一、意图

         定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory使一个类的实例化延迟到其子类。(四人团)

        实际上: 工厂模式主要就是用于创建对象。新添加类时,不会影响以前的系统代码。

    二、基本思想

       核心思想:是用一个工厂来根据输入的条件产生不同的类,然后根据不同类的virtual函数得到不同的结果。

         客户类和工厂类分开,消费者任何时候需要某种产品类对象,只需要向工厂类(有静态成员函数接收)提交参数和请求即可。消费者无需修改(直接用所有产品共同的父类指针指向)就可以接纳和使用新产品类的对象。

    三、优缺点分析

    GOOD: 适用于不同情况创建不同的类时

    BAD:  客户端必须要知道基类和工厂类,耦合性差,而且当产品修改时,工厂类也要做相应修改(如:如何创建及如何向客户端提供)

    四、UML实例图

    clip_image002

    注意点:(工厂类与基类为关联关系)

    五、示例源码

       1: (工厂类与基类为关联关系)
       2: 例:
       3: //基类
       4: class COperation
       5: {
       6: public:
       7:     int m_nFirst;
       8:     int m_nSecond;
       9:     virtual double GetResult()
      10:     {
      11:         double dResult=0;
      12:         return dResult;
      13:     }
      14: };
      15: //加法
      16: class AddOperation : public COperation
      17: {
      18: public:
      19:     virtual double GetResult()
      20:     {
      21:         return m_nFirst+m_nSecond;
      22:     }
      23: };
      24: //减法
      25: class SubOperation : public COperation
      26: {
      27: public:
      28:     virtual double GetResult()
      29:     {
      30:         return m_nFirst-m_nSecond;
      31:     }
      32: };
      33:  
      34: //工厂类
      35: class CCalculatorFactory
      36: {
      37: public:
      38:     static COperation* Create(char cOperator);
      39: };
      40:  
      41: COperation* CCalculatorFactory::Create(char cOperator)
      42: {
      43:     COperation *oper;
      44:     //在C#中可以用反射来取消判断时用的switch,在C++中用什么呢?RTTI??
      45:     switch (cOperator)
      46:     {
      47:     case '+':
      48:         oper=new AddOperation();
      49:         break;
      50:     case '-':
      51:         oper=new SubOperation();
      52:         break;
      53:     default:
      54:         oper=new AddOperation();
      55:         break;
      56:     }
      57:     return oper;
      58: }
      59:  
      60: 客户端
      61: int main()
      62: {
      63:     int a,b;
      64:     cin>>a>>b;
      65:     COperation * op=CCalculatorFactory::Create('-');
      66:     op->m_nFirst=a;
      67:     op->m_nSecond=b;
      68:     cout<<op->GetResult()<<endl;
      69:     return 0;
      70: }
  • 相关阅读:
    微信聊天框测试思路
    巧用&&和|| 让逻辑代码更简洁,逼格看起来更高一点(玩笑脸)
    获取URL中的参数
    解决移动端点击闪烁问题
    npm安装依赖包 --save-dev 和 --save; package.json的devDependencies和dependencies 的区别!
    vue-cli 3配置接口代理
    js小方法积累,将一个数组按照n个一份,分成若干数组
    web前端识别文字转语音
    html 锚点
    ES6 必须要用的数组Filter() 方法,不要再自己循环遍历了!!!
  • 原文地址:https://www.cnblogs.com/steven_oyj/p/1742198.html
Copyright © 2011-2022 走看看