• 工厂方法模式


    【1】什么是工厂方法模式?

    定义一个创建产品对象的工厂接口(IFactory),将实际创建工作推迟到子类(addFactory、subFactory、mulFactory、divFactory)当中。

    核心工厂类(IFactory)不再负责产品的创建,仅作为一个抽象(有纯虚方法)工厂角色,只负责声明具体工厂子类必须实现的接口(即纯虚方法)。

    这样进一步抽象化的好处:系统在不需要修改具体工厂角色的情况下引进新的产品(与简单工厂模式相比)。

    【2】工厂方法模式代码示例

    示例代码如下:

      1 #include <string>
      2 #include <iostream>
      3 using namespace std;
      4 
      5 class Operation
      6 {
      7 protected:
      8     double m_numberA;
      9     double m_numberB;
     10 
     11 public:
     12     double getNumberA()
     13     {
     14         return m_numberA;
     15     }
     16 
     17     void setNumberA(double dValue)
     18     {
     19         m_numberA = dValue;
     20     }
     21 
     22     double getNumberB()
     23     {
     24         return m_numberB;
     25     }
     26 
     27     void setNumberB(double dValue)
     28     {
     29         m_numberB = dValue;
     30     }
     31 
     32     virtual double getResult()
     33     {
     34         return 0;
     35     }
     36 };
     37 
     38 class addOperation : public Operation
     39 {
     40 public:
     41     double getResult()
     42     {
     43         return m_numberA + m_numberB;
     44     }
     45 };
     46 
     47 class subOperation : public Operation
     48 {
     49 public:
     50     double getResult()
     51     {
     52         return m_numberA - m_numberB;
     53     }
     54 };
     55 
     56 class mulOperation : public Operation
     57 {
     58 public:
     59     double getResult()
     60     {
     61         return m_numberA * m_numberB;
     62     }
     63 };
     64 
     65 class divOperation : public Operation
     66 {
     67 public:
     68     double getResult()
     69     {
     70         return m_numberA / m_numberB;
     71     }
     72 };
     73 
     74 class IFactory
     75 {
     76 public:
     77     virtual Operation *createOperation() = 0;
     78 };
     79 
     80 class AddFactory : public IFactory
     81 {
     82 public:
     83     static Operation *createOperation()
     84     {
     85         return new addOperation();
     86     }
     87 };
     88 
     89 class SubFactory : public IFactory
     90 {
     91 public:
     92     static Operation *createOperation()
     93     {
     94         return new subOperation();
     95     }
     96 };
     97 
     98 class MulFactory : public IFactory
     99 {
    100 public:
    101     static Operation *createOperation()
    102     {
    103         return new mulOperation();
    104     }
    105 };
    106 
    107 class DivFactory : public IFactory
    108 {
    109 public:
    110     static Operation *createOperation()
    111     {
    112         return new divOperation();
    113     }
    114 };
    115 
    116 void main()
    117 {
    118     Operation *pOper = MulFactory::createOperation();
    119     pOper->setNumberA(9);
    120     pOper->setNumberB(99);
    121     cout << pOper->getResult() << endl;
    122     
    123     delete pOper;
    124     pOper = NULL;
    125 
    126     system("pause");
    127 }
    128 
    129 // run out:
    130 /*
    131 891
    132 请按任意键继续. . .
    133 */

    【3】工厂方法模式示例代码

    代码如下:

     1 #include <string>
     2 #include <iostream>
     3 using namespace std;
     4 
     5 // 抽象产品类1
     6 class IUser
     7 {
     8 public:
     9     virtual void getUser() = 0;
    10     virtual void setUser() = 0;
    11 };
    12 
    13 // 具体产品类1(SqlUser)
    14 class SqlUser : public IUser
    15 {
    16 public:
    17     void getUser()
    18     {
    19         cout << "在sql中返回user" << endl;
    20     }
    21     void setUser()
    22     {
    23         cout << "在sql中设置user" << endl;
    24     }
    25 };
    26 
    27 // 具体产品类1(AccessUser)
    28 class AccessUser : public IUser
    29 {
    30 public:
    31     void getUser()
    32     {
    33         cout << "在Access中返回user" << endl;
    34     }
    35     void setUser()
    36     {
    37         cout << "在Access中设置user" << endl;
    38     }
    39 };
    40 
    41 // 抽象工厂类
    42 class IFactory
    43 {
    44 public:
    45     virtual IUser *createUser() = 0;
    46 };
    47 
    48 // 具体工厂类(SqlFactory)
    49 class SqlFactory : public IFactory
    50 {
    51 public:
    52     IUser *createUser() 
    53     {
    54         return new SqlUser(); // 创建具体产品1(SqlUser)
    55     }
    56 };
    57 
    58 // 具体工厂类(AccessFactory)
    59 class AccessFactory : public IFactory
    60 {
    61 public:
    62     IUser *createUser()
    63     {
    64         return new AccessUser(); // 创建具体产品1(AccessUser)
    65     }
    66 };
    67 
    68 void main()
    69 {
    70     IFactory* pFactory = new SqlFactory;
    71     IUser* pUser = pFactory->createUser();
    72     pUser->getUser();
    73     pUser->setUser();
    74 
    75     delete pFactory;
    76     pFactory = new AccessFactory;
    77     delete pUser;
    78     pUser = pFactory->createUser();
    79     pUser->getUser();
    80     pUser->setUser();
    81 
    82     delete pUser;
    83     pUser = NULL;
    84 
    85     system("pause");
    86 }
    87 
    88 // run out:
    89 /*
    90 在sql中返回user
    91 在sql中设置user
    92 在Access中返回user
    93 在Access中设置user
    94 请按任意键继续. . .
    95 */

    以上代码主要与《抽象工厂模式》对比,为了更好的理解两者之间的区别。

    Good Good Study, Day Day Up.

    顺序 选择 循环 总结

  • 相关阅读:
    reason: ‘Could not instantiate class named NSLayoutConstraint’
    wzplayer 成功支持IOS
    【搜索】P1219 八皇后
    原生JS的移入溢出控制div的显示与隐藏
    es3设置属性不能修改
    插槽在父组件和子组件间的使用(vue3.0推荐)
    es5设置属性不能修改
    jquery操作css样式的方法
    基于jQuery的AJAX和JSON的实例 模版
    C#实现根据IP 查找真实地址
  • 原文地址:https://www.cnblogs.com/Braveliu/p/3942359.html
Copyright © 2020-2023  润新知