策略模式和簡單工廠模式的區別
直接上程式碼:
簡單工廠模式:
------------------------------1個抽象類 --------------------------
abstract class AbsClass
{
//抽象方法:提供一些列的演算法操作
public abstract void acceptCash(string org);
}
------------------------------2個實現類 --------------------------
//繼承自抽象類 class A:AbsClass { //具體方法:提供一些列的演算法操作 public override double acceptCash(string org) { Console.WriterLine("A類方法"); } }
//繼承自抽象類
class B:AbsClass
{
//具體方法:提供一些列的演算法操作
public override double acceptCash(string org)
{
Console.WriterLine("B類方法");
}
}
------------------------------簡單工廠類 --------------------------
//現金收取工廠 class CashFactory { //根據條件返回相應的物件 public static AbsClass createCashAccept(stringtype) { AbsClass cs = null; switch (type) { case "A": cs = new Al(); break; case "B": cs = new B(); break; case "...": ........ .... break; } return cs; } }
客戶端呼叫:
/利用簡單工廠模式根據下拉選擇框,生成相應的物件
AbsClass csuper = CashFactory.createCashAccept("A");// 通過傳入type 就可以得到具體的實現類,就好比:你去機場,你直接跟你祕書說,我們開車去機場,這個時候你祕書開車載我去,你負責坐車到機場就可以了。
AbsClass csuper= CashFactory.createCashAccept("B"); //或者 祕書去叫出租車 我們打車去
策略模式
前面的類沒有任何變化,只是把CashFactory變成了CaseContext策略類
//策略Context class CashContext { //宣告一個現金收費父類物件 private AbsClass cs; //設定策略行為,引數為具體的現金收費子類(正常,打折或返利) public CashContext(AbsClass csuper) { this.cs = csuper; } //得到現金促銷計算結果(利用了多型機制,不同的策略行為導致不同的結果) public double GetResult(double money) { return cs.acceptCash(money); } }
客戶端呼叫:
AbsClass cc = null;
switch (cbxType.SelectedItem.ToString())
{
case "A":
cc = new CashContext(new A()); //同樣是去機場,此時:自己開車去
break;
case "B":
cc = new CashContext(new B());//或者自己打車去
break;
case "...":
... ....
break;
}
概括總結:
策略模式和簡單工廠模式看起來非常相似,都是通過多型來實現不同子類的選取。
如果從使用這兩種模式的角度來看的話,我們會發現在簡單工廠模式中我們只需要傳遞相應的條件就能得到想要的一個物件(告訴別人我要幹嘛、別人去做),然後通過這個物件實現演算法的操作。而策略模式,使用時必須首先建立一個想使用的類物件(自己去 做),然後將該物件最為引數傳遞進去,通過該物件呼叫不同的演算法。在簡單工廠模式中實現了通過條件選取一個類去例項化物件,策略模式則將選取相應物件的工作交給模式的使用者,它本身不去做選取工作。
結合上面的程式碼不難看出,其實兩個的差別很微妙,Factory是直接建立具體的物件並用該物件去執行相應的動作,而Context將這個操作給了Context類,沒有建立具體的物件,實現的程式碼的進一步封裝,客戶端程式碼並不需要知道具體的實現過程。
當然用的最多的還是兩者的結合使用。
總結:簡單工廠模式:只需要發出命令,由他人去實現,策略模式:不僅僅要發出命令,還得由自己親自去做。