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 }
本文参考自:程杰《大话设计模式》