簡單工廠模式
定義:由一個工廠類決定建立出哪種類的實例。以大話設計模式中的運算器的設計爲例。咱們能夠抽象出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); } }
總結
簡單工廠模式的優勢:
利用繼承與多態,由一個工廠實例化類,而不須要調用方本身去實例化類。有助於類的解耦。
策略模式的優勢:
一、封裝了算法。 二、算法實現類的父類總結出類算法的公共功能。 三、每一個算法單獨實現,相互之間沒有耦合。 策略模式的缺點: 調用方對算法實現類的選擇須要本身作衡量。 策略模式和工廠模式結合的優勢: 將實現類的選擇交給了策略工廠類,使調用方的代碼更乾淨。 策略模式和工廠模式結合的缺點: 雖然在調用方的代碼中去掉了分支判斷,可是若是須要增長實現類,仍是須要修改策略工廠類的。