zoukankan      html  css  js  c++  java
  • C++实现设计模式之 — 简单工厂模式

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4251756.html

    所谓简单工厂模式,是一种实例化对象的方式,只要输入需要实例化对象的名字,就可以通过工厂对象的相应工厂函数来制造你需要的对象。

    简单工厂模式的核心是,对于一个父类的多个继承子类,工厂对象的工厂函数根据用户输入,自动new出一个子类对象并返回其父类的指针,这样利用父类的指针执行父类的虚函数,就可以动态绑定子类的重写函数,从而实现多态。

    对于一个只拥有加减乘除运算的简单计算器,我们设计一个Operation的父类,并构造加减乘除四个类继承父类重写运算函数GetResult。然后定义工厂类中的工厂函数,其根据用户的输入new出相应的对象实例并返回其父类的指针。

    UML图如下所示:

    C++代码如下所示,其中使用了智能指针类shared_ptr,当该对象的生命期结束时,其析构函数能够自动析构掉指针所指的对象。

     1 #include <stdlib.h>
     2 #include <stdio.h>
     3 #include <string.h>
     4 #include <iostream>
     5 #include  <tr1/memory>
     6 
     7 using namespace std;
     8 
     9 class Operation
    10 {
    11     private:
    12         double A, B;
    13     public:
    14         double GetA() const {return A;}
    15         double GetB() const {return B;}
    16         void SetA(double x) {A=x;}
    17         void SetB(double y) {B=y;}
    18         double virtual GetResult(){return 0;}
    19         Operation():A(0), B(0){}
    20 };
    21 
    22 class Add : public Operation
    23 {
    24     public:
    25         double GetResult()
    26         {
    27             return GetA()+GetB();
    28         }
    29 };
    30 
    31 class Sub : public Operation
    32 {
    33     public:
    34         double GetResult()
    35         {
    36             return GetA()-GetB();
    37         }
    38 };
    39 
    40 class Mul : public Operation
    41 {
    42     public:
    43         double GetResult()
    44         {
    45             return GetA()*GetB();
    46         }
    47 };
    48 
    49 class Div : public Operation
    50 {
    51     public:
    52         double GetResult()
    53         {
    54             return GetA()/GetB();
    55         }
    56 };
    57 
    58 class SimpleFactory
    59 {
    60     public:
    61         static Operation * CreateOpeartor(char ch)
    62         {
    63             Operation * p;
    64             switch(ch)
    65             {
    66                 case '+':
    67                     p = new Add();
    68                     break;
    69                 case '-':
    70                     p = new Sub();
    71                     break;
    72                 case '*':
    73                     p = new Mul();
    74                     break;
    75                 case '/':
    76                     p = new Div();
    77                     break;
    78             }
    79             return p;
    80         }
    81 };
    82         
    83 int main(int argc, char *argv[])
    84 {
    85     double A = 0;
    86     double B = 0;
    87     char ch = '';
    88     cin>>A>>ch>>B;
    89 
    90     tr1::shared_ptr<Operation> op(SimpleFactory::CreateOpeartor(ch));
    91     op->SetA(A);
    92     op->SetB(B);
    93     cout<<op->GetResult()<<endl;
    94 }

     

    本文参考自:程杰《大话设计模式》

  • 相关阅读:
    网页设计太麻烦?15款免费优质Bootstrap UI工具包助你效率倍增!
    【自古套路得人心】最全UI图表设计技巧和套路,分分钟打造最优设计
    原型对接工作流!摹客全面支持Axure原型
    赶紧收藏!41个Web UI工具包资源免费及付费下载
    2019年设计师必看,UI加载动画完全解读
    845G
    845G
    845D
    845C
    845B
  • 原文地址:https://www.cnblogs.com/jostree/p/4251756.html
Copyright © 2011-2022 走看看