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 = '\0';
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 }

 

 

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

posted @ 2015-01-27 11:13  jostree  阅读(7350)  评论(0编辑  收藏  举报