策略模式VS简单工厂模式

简单工厂模式

定义:由一个工厂类决定建立出哪种类的实例。以大话设计模式中的运算器的设计为例。咱们能够抽象出OperationFactory类来实例化具体的运算类。
具体代码以下:
    public class OperationFactory{ public static Operation createOperate(String operate){ Operation oper = null; switch(opterate){ case "+": oper = new AddOperation(); break; case "-": oper = new SubOperation(); break; case "*": oper = new MulOperation(); break; case "/": oper = new DivOperation(); break; } return oper; } }
可得类图以下:

策略模式

定义:定义了算法家族分别封装起来,让他们之间能够互相转换,此模式让算法的变化,不会影响到使用算法的用户。
一样,以大话设计模式中的促销系统为例,讲解策略模式。假设超市须要一个促销系统,能够提供如满减,打折等形式的促销计价。
运用策略模式,咱们能够设计类CashContext:
public class CashContext{ private CashSuper cs: public CashContext(CashSuper csuper){ this.cs = cspuer; } public double GetResult(double money){ return cs.acceptCash(money); } }
这样,咱们在定义一个CashSuper抽象类来标明促销类型,而后各实现类来负责各种型的计算。具体类图以下:

策略与简单工厂的结合

按照策略模式的设计,咱们的客户端的设计须要指定具体的实现子类
而后才能调用CashContext的GetResult方法。
这样,在客户端的设计中咱们须要将先生成实现子类,而后调用策略模式进行成交价格的计算。系统耦合加大。
咱们能够结合策略模式和工厂模式,将找到实现类的方式经过工厂进行封装,而后在工厂内实现策略模式进行实现类的运算。
改造后的CashContext:
public class CashContext{ private CashSuper cs: public CashContext(String type){ switch(type){ case "正常收费": cs = new CashNormal(); break; case "满300-100": cs = new CashReturn(300, 100); break; case "打8折": cs = new CashRebate(0.8); break; } } public double GetResult(double money){ return cs.acceptCash(money); } }

总结

简单工厂模式的优势:
利用继承与多态,由一个工厂实例化类,而不须要调用方本身去实例化类。有助于类的解耦。
策略模式的优势:
一、封装了算法。 二、算法实现类的父类总结出类算法的公共功能。 三、每一个算法单独实现,相互之间没有耦合。 策略模式的缺点: 调用方对算法实现类的选择须要本身作衡量。 策略模式和工厂模式结合的优势: 将实现类的选择交给了策略工厂类,使调用方的代码更干净。 策略模式和工厂模式结合的缺点: 虽然在调用方的代码中去掉了分支判断,可是若是须要增长实现类,仍是须要修改策略工厂类的。
相关文章
相关标签/搜索