策略模式与简单工厂模式区别(转)
?
最近一直在抽時間研究設計模式,之前對設計模式也有一定的了解,但是都沒有平心靜氣的去研究過,只是了解了一些皮毛,最近打算再深入研究一下,重新打開了設計模式的數據,對之前的疑問一個個的刨根問底,今天看了簡單工廠模式和策略模式看的人有點小暈,兩個的大概思路沒有怎么變,都是通過多態去減少代碼的耦合度,怎么看兩個都是如出一轍,最后終于找到了兩個的本質區別,在此和大家分享下:
先上代碼:
簡單工廠模式:
//抽象類
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);
??? }
}
?
客戶端調用:
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類,沒有創建具體的對象,實現的代碼的進一步封裝,客戶端代碼并不需要知道具體的實現過程。
上面是在網絡看到的一篇文章
下面加上我的理解:
1、按一般教程中出現的例子理解:
簡單工廠模式:傳條件進工廠類,工廠類就會返回一個對象給調用者,供調用者使用---最終給用戶使用的是工廠類返回的類
策略模式:創建一個Context類(可以看作是工廠模式中工廠類的代替品)的對象A,傳一個要使用的策略實例對象給A,然后使用A調用A中的某些方法---最終給用戶用的是Context類
簡單的說,工廠有進貨也有出貨,然后使用出貨。策略有進貨沒出貨,然后使用得貨者。
2、更準確理解:用戶是使用工廠類生產的對象(要求工廠類生產對象的類的對象)進行操作,而用戶是使用用戶自己傳給策略的對象進行操作。
簡單的說,工廠類的使用者需要不是自己創建的對象,策略模式中Context類的使用者需要的是自己創建的對象。
更簡單的說,工廠模式:我沒有,我需要你的。策略模式:我自己有,我用我自己的。
總結
以上是生活随笔為你收集整理的策略模式与简单工厂模式区别(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 邮政信用卡挂号信怎么收取?可以自己领吗?
- 下一篇: 信用卡欠50万自救方法 这三招教你补救!