设计模式1:简单工厂模式

这个例子来自于《大话设计模式》的第一章。

简单工厂模式有3个基本的类:工厂类,抽象产品类,具体产品类。

使用抽象产品类作为一个基类,其余具体产品类继承它的基础数据,然后实现具体的功能。工厂类根据客户的需求来决定生成哪一个具体产品的对象。这种想法下抽象产品类应该设定为抽象类。这道题目虽然思路并不难,实现也不复杂。但是它却很好的体现了面向对象的设计思想。

说一说我对设计模式的理解,我们平时写的代码量如果小的话,根本用不到设计模式。比如你写一个排序算法,想用设计模式都 用不进去。但是对于大的项目工程,设计模式就特别重要。因为你看看设计模式的思想,实现代码的低耦合,使得代码可维护,可复用,可扩展,灵活性高。也就是说,设计模式使得你写的代码更clean,更有规则性。对于一个公司的项目来说,功能设计必须分开,因为不同的业务是不同的组实现的,而且可能人家组有自己的秘密呢(^_^)。这就是低耦合。而且加功能,改功能是很常见的需求,因为客户的需求总是变化的,这时候代码的可维护、可复用就很重要了。这就是设计模式的重要之处,让你写出更clean的代码。自己更容易维护和修改,你的同事也是。

  1 //实现一个计算器控制台程序
  2 #include<iostream>
  3 //#include<cstdlib>
  4 using namespace std;
  5 //抽象产品类
  6 class operate
  7 {
  8 protected:
  9     double numberA;
 10     double numberB;
 11 public:
 12     double getnumA()
 13     {
 14         return numberA;
 15     }
 16     double getnumB()
 17     {
 18         return numberB;
 19     }
 20     void setnumA(double initialA)
 21     {
 22         numberA=initialA;
 23     }
 24     void setnumB(double initialB)
 25     {
 26         numberB=initialB;
 27     }
 28     virtual double getresult()
 29     {
 30         double result=0;
 31         return result;
 32     }
 33 };
 34 //具体产品类
 35 class AddOperation:public operate
 36 {
 37 public:
 38 //这里的public可以不写吗?
 39 
 40     double getresult()
 41     {
 42         double result=0;
 43         result=numberA+numberB;
 44         return result;
 45     }
 46 };
 47 class SubOperation:public operate
 48 {
 49     public:
 50     double getresult()
 51     {
 52         double result=0;
 53         result=numberA-numberB;
 54         return result;
 55     }
 56 };
 57 class MultipylOperation:public operate
 58 {
 59     public:
 60     double getresult()
 61     {
 62         double result=0;
 63         result=numberA*numberB;
 64         return result;
 65     }
 66 };
 67 class DividOperation:public operate
 68 {
 69     public:
 70     double getresult()
 71     {
 72         if(numberB==0)
 73         {
 74             cout<<"divisor can't be 0!"<<endl;
 75             return 0;
 76         }
 77         double result=0;
 78         result=numberA/numberB;
 79         return result;
 80     }
 81 };
 82 //工厂类
 83 class operationfactory
 84 {
 85     public:
 86     operate* CreatOperation(char type)
 87     {
 88         operate* oper;
 89         switch(type)
 90         {
 91             case '+':
 92             oper=new AddOperation;
 93             break;
 94             case '-':
 95             oper=new SubOperation;
 96             break;
 97             case '*':
 98             oper=new MultipylOperation;
 99             break;;
100             case '/':
101             oper=new DividOperation;
102             break;
103         }
104         return oper;
105     }
106 };
107 //界面与输出
108 void calculater()
109 {
110     cout<<"enter ther formulate you want to calculate:"<<endl;
111     int numberA,numberB;
112     char symbol;
113     operate* oper=NULL;
114     cin>>numberA;
115     cin>>numberB;
116     cin>>symbol;
117     operationfactory op;
118     oper=op.CreatOperation(symbol);
119     //double re=0;
120     oper->setnumA(numberA);
121     oper->setnumB(numberB);
122     
123     cout<<oper->getresult()<<endl;
124     if(oper!=NULL)//释放内存
125     {
126         delete oper;
127         oper=NULL;
128     }
129     system("pause");
130     //cout<<re<<endl;
131 }
132 int main()
133 {
134     //cout<<"what can i do for you?"
135     //cout<<"enter a number:"
136     //cin>>numberA;
137     calculater();
138     return 0;
139 }

我还给自己的代码写了一点坑,比如实现界面,实现一个多个项目的加减乘数的算法,留着以后慢慢填哈~

posted @ 2019-08-11 21:19  妮妮熊  阅读(187)  评论(0编辑  收藏  举报