簡單工廠模式和策略模式的差別


直接上代碼:

簡單工廠模式:

------------------------------一個抽象類   --------------------------
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;
    }
}

 

client調用:

/利用簡單工廠模式依據下拉選擇框,生成對應的對象
AbsClass csuper = CashFactory.createCashAccept("A");// 通過傳入type 就能夠得到詳細的實現類。就好比:你去機場,你直接跟你秘書說,我們開車去機場。這個時候你秘書開車載我去,你負責坐車到機場就能夠了。

AbsClass csuper= CashFactory.createCashAccept("B"); //或者 秘書去叫出租車 我們打車去

 


------------------------------策略模式:   --------------------------

 前面的類沒有不論什么變化,僅僅是把Factory變成了CaseContext策略類

//策略Context
class CashContext
{
    //聲明一個現金收費父類對象
    private AbsClass cs;

    //設置策略行為,參數為詳細的現金收費子類(正常,打折或返利)
    public CashContext(AbsClass csuper)
    {
        this.cs = csuper;
    }

    //得到現金促銷計算結果(利用了多態機制,不同的策略行為導致不同的結果)
    public double GetResult(double money)
    {
        return cs.acceptCash(money);
    }
}

client調用:

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類。沒有創建詳細的對象,實現的代碼的進一步封裝,client代碼並不須要知道詳細的實現過程。

當然用的最多的還是兩者的結合使用

------------------------------策略模式和簡單工廠模式:   --------------------------

 前面的類沒有不論什么變化,僅僅是把Factory變成了CaseContext策略類

//策略Context
class CashContext
{
    //聲明一個現金收費父類對象
    private AbsClass cs;

  public CashContext(String typr)
    {
        switch (type)     //跟秘書打個招呼 我要去機場
             {
                case "A":
                    cc = new CashContext(new A()); //相同是去機場,此時:自己開車去
                    break;
                case "B":
                    cc = new CashContext(new B());//或者自己打車去
                    break;
                case "...":
                    ... ....
                    break;
             }

  }

    //得到現金促銷計算結果(利用了多態機制,不同的策略行為導致不同的結果)
    public double GetResult(double money)
    {
        return cs.acceptCash(money);
    }
}

client調用:

CashContext context= CashContext("A");

double a=context.GetResult(double money);

總結:簡單工廠模式:只須要發出命令,由他人去實現,策略模式:不只要發出命令,還得由自己親自去做。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM