zoukankan      html  css  js  c++  java
  • 简单工厂模式(静态工厂方法模式)

    以计算器程序为例:只需输入运算符号,程序就实例化出合适的对象。通过多态,返回父类的方式实现了计算器的结果。

    1)静态工厂方法统一管理对象的创建。

      静态工厂方法通过传入的参数判断决定创建哪一个产品的实例,封装了对象的创建,客户端只管消费,实现了对责任(模块)的分割。

    2)静态工厂方法推迟了产品的实例化。

      通过XML配置文件就能改变具体创建的产品实例,修改为其他的产品实例,代码不须重新编译。

                  简单工厂模式结构图

    C++代码实例实现:

      1 #include<iostream>
      2 using namespace std;
      3 
      4 class Operation{
      5 private:
      6     double numberA;
      7     double numberB;
      8 public:
      9     Operation();
     10     double GetNumberA();
     11     void SetNumberA(double);
     12     double GetNumberB();
     13     void SetNumberB(double);
     14     virtual double GetResult()
     15     {
     16         double result = 0;
     17         return result;
     18     }
     19 };
     20 //函数实现
     21 Operation::Operation()
     22 {
     23     numberA = 0;
     24     numberB = 0;
     25 }
     26 double Operation::GetNumberA()
     27 {
     28     return numberA;
     29 }
     30 void Operation::SetNumberA(double a)
     31 {
     32     numberA = a;
     33 }
     34 
     35 double Operation::GetNumberB()
     36 {
     37     return numberB;
     38 }
     39 void Operation::SetNumberB(double b)
     40 {
     41     numberB = b;
     42 }
     43  
     44 class OperationAdd : public Operation
     45 {
     46 public:
     47     virtual double GetResult()
     48     {
     49         double result = 0;
     50         result = GetNumberA() + GetNumberB();
     51         return result;
     52     }
     53 };
     54 class OperationSub : public Operation
     55 {
     56 public:
     57     virtual double GetResult()
     58     {
     59         double result = 0;
     60         result = GetNumberA() - GetNumberB();
     61         return result;
     62     }
     63 };
     64 class OperationMul : public Operation
     65 {
     66 public:
     67     virtual double GetResult()
     68     {
     69         double result = 0;
     70         result = GetNumberA() * GetNumberB();
     71         return result;
     72     }
     73 };
     74 class OperationDiv : public Operation
     75 {
     76 public:
     77     virtual double GetResult()
     78     {
     79         double result = 0;
     80         if(GetNumberB() == 0)
     81             return -1;
     82         result = GetNumberA() / GetNumberB();
     83         return result;
     84     }
     85 };
     86 //工厂类
     87 class OperationFactory
     88 {
     89 public:
     90     //静态工厂方法
     91     static Operation* createOperate(char c)
     92     {
     93         switch(c)
     94         {
     95         case '+':
     96             return new OperationAdd();
     97             break;
     98         case '-':
     99             return new OperationSub();
    100             break;
    101         case '*':
    102             return new OperationMul();
    103             break;
    104         case '/':
    105             return new OperationDiv();
    106             break;
    107         }
    108         return NULL;
    109     }
    110 
    111 };
    112 void main()
    113 {//客户端代码
    114     
    115     OperationFactory operfactory;
    116     Operation *oper = operfactory.createOperate('+'); 
    117     oper->SetNumberA(2);
    118     oper->SetNumberB(4);
    119     double result = oper->GetResult();
    120     cout << result <<endl;
    121 }

     这样就实现了后台代码与界面实现代码的隔离。不管是控制台程序,Windows程序,Web程序,都可以用客户端代码实现计算器的功能。界面的修改与运算程序无关。如果我们要更改加法运算,只需改OperationAdd类就可以,如果需要增加复杂运算,只需增加相应的运算子类并修改运算类工厂,在switch中加入一个分支就可以。

  • 相关阅读:
    Orchard CMS中如何打包不带源码的模块
    牛X的CSS3
    Docker指令
    Spring Boot 应用 发布到Docker
    Haproxy全透明代理
    TCP/IP协议理解
    ubuntu tomcat 部署java web
    UDP"打洞"原理
    java多线程-线程通信
    window环境下杀死tomcat
  • 原文地址:https://www.cnblogs.com/shellfishsplace/p/6337530.html
Copyright © 2011-2022 走看看