zoukankan      html  css  js  c++  java
  • 设计模式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 }

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

  • 相关阅读:
    HDU 5938 Four Operations 【贪心】(2016年中国大学生程序设计竞赛(杭州))
    HDU 5935 Car 【模拟】 (2016年中国大学生程序设计竞赛(杭州))
    HDU 5934 Bomb 【图论缩点】(2016年中国大学生程序设计竞赛(杭州))
    HDU 5933 ArcSoft's Office Rearrangement 【模拟】(2016年中国大学生程序设计竞赛(杭州))
    HDU 5929 Basic Data Structure 【模拟】 (2016CCPC东北地区大学生程序设计竞赛)
    【转】LaTeX 符号命令大全
    HDU 5922 Minimum’s Revenge 【模拟】 (2016CCPC东北地区大学生程序设计竞赛)
    HDU 5927 Auxiliary Set 【DFS+树】(2016CCPC东北地区大学生程序设计竞赛)
    数据结构之稀疏矩阵
    C++中引用(&)的用法和应用实例
  • 原文地址:https://www.cnblogs.com/neverland0718/p/11336764.html
Copyright © 2011-2022 走看看