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 }

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

  • 相关阅读:
    网络配置
    数据管理
    仓库
    dockerfile
    docker 概念
    查看日志小技巧
    springboot缓存
    360笔试算法题 AT变换
    删除链表里全部重复元素以及删除链表重复元素只保留一个
    报错类型
  • 原文地址:https://www.cnblogs.com/neverland0718/p/11336764.html
Copyright © 2011-2022 走看看