读了《大话设计模式》,发现以前都对工厂模式,工厂二字的对象理解错了,这里的工厂是产生各种类的工厂。
工厂原本只包含一个父类指针,根据构造函数中输入的参数,生成想生成的子类。
《大话设计模式》中的源代码:
public class EasyFactory {
// 简单工厂,根据字符串创建相应的对象
public static Operation createOperation(String name) {
Operation operationObj = null;
switch (name) {
case "+":
operationObj = new Add();
break;
case "-":
operationObj = new Sub();
break;
case "*":
operationObj = new Mul();
break;
case "/":
operationObj = new Div();
break;
}
return operationObj;
}
---------------------
作者:cosmos_lee
来源:CSDN
原文:https://blog.csdn.net/u012156116/article/details/80857255
版权声明:本文为博主原创文章,转载请附上博文链接!
这里直接贴了这个链接的内容:
https://www.cnblogs.com/fengyubo/p/4884987.html
part 2 策略模式 Strategy
动机(Motivation)
#在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。
#如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题?
模式定义
定义一系列算法,把它们一个个封装起来,并且使它们可互相替换(变化)。该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展,子类化)。——《设计模式》GoF
UML
代码实现
要实现一个计算税率的类。由于中国、美国以及将来可能会出现的各国之间的税率算法是不一样的,所以要采用一种设计模式来抵御变化(业务需求的变化)。从外层开始,一个类一个类的交代,直到内层核心的类。
1. Context类,用于存储计算税率时要用到的“上下文”。
struct Context { // 为了简化代码,暂不定义计算税率时的上下文 };
2. TaxStrategy类,为实现具体税率算法的上层抽象。定义的纯虚函数目的是实现运行时多态。
struct TaxStrategy { virtual double calculate(const Context& c) = 0; virtual ~TaxStrategy(); // 抽象基类的析构方法一定要定义为虚函数 };
3. ChinaTax类,具体税率算法的实现类。
struct ChinaTax : public TaxStrategy{ virtual double calculate(const Context& c) { return 1.0; } };
4. StrategyFactory 利用工厂方法模式实习了具体抽象类的动态创建。比如,可以生成ChinaTax类、America类对象等。
struct StrategyFactory{ TaxStrategy* newStrategyFactory() {} };
5. SalesOrder类,属于客户端的调用——根据我对《大话设计模式》的理解。
struct SalesOrder { TaxStrategy *strategy; SalesOrder(StrategyFactory& sf){ this->strategy = sf.newStrategyFactory(); } ~SalesOrder() { delete this->strategy; }; double calculateTax() { Context c; double val = strategy->calculate(c); // 多态调用 } };
变化
假设有一天需求增加了,需要增加对美国(America)的业务,所以税率算法需要增加对美国的支持。有了策略模式,只需让新增的类继承抽象基类 TaxStrategy ,重写虚函数 calculate() 即可!
// 拓展美国业务 // 客户需求的变化 struct AmericaTax : public TaxStrategy { virtual double calculate(const Context& c) { return 2.0; } };
要点总结
#所谓设计模式和面向对象所讲的“复用”:编译单位、二进制层面的复用。当代码写完、编译、测试、部署之后原封不动,对需求变化比较稳定叫作复用;源代码级别的复制粘贴不叫复用。
#Strategy及其子类为组件提供了一系列可重用的算法,从而可以使得类型在运行时方便地根据需要在各个算法之间进行切换。
#Strategy模式提供了用条件判断语句以外的另一种选择,消除条件判断语句,就是在解耦合。含有许多条件判断语句的代码通常都需要Strategy模式。
#如果Strategy对象没有实例变量,那么各个上下文可以共享同一个Strategy对象,从而节省对象开销。