001 --- 第1章 简单工厂模式

简述:

  简单工厂模式,如其名,简单,简单到明明是24种设计模式,却只归类为23种设计模式,把它排除了,但我还是写了出来。

  简单工厂模式包括:工厂类、抽象产品类、具体产品类。

    工厂类:制造产品,会有一个Create之类得函数,可以根据不同的标识符生产不同的具体产品,当然这些具体产品都继承自抽象产品。

    抽象产品类:具体产品类的基类。

    具体产品类:抽象产品类的派生类,当需要增加新的产品时,可以根据需要增加一个继承自抽象产品类的具体产品类,然后在工厂类中增加相应的处理分支即可。

  简单工厂模式实现了松耦合,当需要新增一种产品时,只需要做两点改动:

    增加一个继承自抽象类的具体产品类。

    在工厂类中增加响应的处理分支。

 

例:加减乘除四则运算

代码如下:

  1 #include <iostream>
  2 using namespace std;
  3 
  4 // 运算基类(抽象产品类)
  5 class COperation
  6 {
  7 private:
  8     double m_dA = 0;
  9     double m_dB = 0;
 10 public:
 11     void SetA(double dA)
 12     {
 13         m_dA = dA;
 14     }
 15     double GetA()
 16     {
 17         return m_dA;
 18     }
 19     void SetB(double dB)
 20     {
 21         m_dB = dB;
 22     }
 23     double GetB()
 24     {
 25         return m_dB;
 26     }
 27     virtual double GetResult()
 28     {
 29         double dResult = 0;
 30         return dResult;
 31     }
 32 };
 33 
 34 // 加法类(具体产品类)
 35 class COperationAdd : public COperation
 36 {
 37 public:
 38     virtual double GetResult()
 39     {
 40         double dResult = 0;
 41         dResult = GetA() + GetB();
 42         return dResult;
 43     }
 44 };
 45 
 46 // 减法类(具体产品类)
 47 class COperationSub : public COperation
 48 {
 49 public:
 50     virtual double GetResult()
 51     {
 52         double dResult = 0;
 53         dResult = GetA() - GetB();
 54         return dResult;
 55     }
 56 };
 57 
 58 // 乘法类(具体产品类)
 59 class COperationMul : public COperation
 60 {
 61 public:
 62     virtual double GetResult()
 63     {
 64         double dResult = 0;
 65         dResult = GetA() * GetB();
 66         return dResult;
 67     }
 68 };
 69 
 70 // 除法类(具体产品类)
 71 class COperationDiv : public COperation
 72 {
 73 public:
 74     virtual double GetResult()
 75     {
 76         double dResult = 0;
 77         if (0 == GetB())
 78             throw "除数不能为0!";
 79         dResult = GetA() / GetB();
 80         return dResult;
 81     }
 82 };
 83 
 84 // 简单工厂类
 85 class COperationFactory
 86 {
 87 public:
 88     static COperation* CreateOperate(char chOperate)
 89     {
 90         COperation* pOperation = NULL;
 91         switch (chOperate)
 92         {
 93         case '+':
 94             pOperation = new COperationAdd();
 95             break;
 96         case '-':
 97             pOperation = new COperationSub();
 98             break;
 99         case '*':
100             pOperation = new COperationMul();
101             break;
102         case '/':
103             pOperation = new COperationDiv();
104             break;
105         }
106         return pOperation;
107     }
108 };
109 
110 int main()
111 {
112     COperation* pOperation;
113     char chType = '/';
114     pOperation = COperationFactory::CreateOperate(chType);
115     pOperation->SetA(10);
116     pOperation->SetB(2);
117 
118     double dResult = pOperation->GetResult();
119     cout << dResult << endl;
120 
121     // C++堆区创建的对象需要手动释放资源
122     if (pOperation)
123         delete pOperation;
124 
125     system("pause");
126     return 0;
127 }

 

输出结果:

 

posted @ 2020-08-10 10:45  二是一种不三不亖的范  阅读(213)  评论(0编辑  收藏  举报