以计算器程序为例:只需输入运算符号,程序就实例化出合适的对象。通过多态,返回父类的方式实现了计算器的结果。
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中加入一个分支就可以。
时间: 2024-10-20 08:11:25