最近一直在抽時間研究設計模式,之前對設計模式也有一定的了解,但是都沒有平心靜氣的去研究過,只是了解了一些皮毛,最近打算再深入研究一下,重新打開了設計模式的數據,對之前的疑問一個個的刨根問底,今天看了簡單工廠模式和策略模式看的人有點小暈,兩個的大概思路沒有怎么變,都是通過多態去減少代碼的耦合度,怎么看兩個都是如出一轍,最后終於找到了兩個的本質區別,在此和大家分享下:
先上代碼:
簡單工廠模式:
//抽象類
abstract class AbsClass
{
//抽象方法:提供一些列的算法操作
public abstract void acceptCash(string org);
}
//繼承自抽象類
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(string type)
{
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");
策略模式:
前面的類沒有任何變化,只是把Factory變成了CaseContext策略類
//策略Context
class CashContext
{
//聲明一個現金收費父類對象
private AbsClass cs;
//設置策略行為,參數為具體的現金收費子類(正常,打折或返利)
public CashContext(AbsClass csuper)
{
this.cs = csuper;
}
//得到現金促銷計算結果(利用了多態機制,不同的策略行為導致不同的結果)
public double GetResult(double money)
{
return cs.acceptCash(money);
}
}
客戶端調用:
CashContext 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類,沒有創建具體的對象,實現的代碼的進一步封裝,客戶端代碼並不需要知道具體的實現過程。