簡單工廠模式和策略模式的區(qū)別
看書上的介紹《大話設(shè)計模式》,這兩很像,都是用一個專門的類來根據(jù)客戶端的條件產(chǎn)生不同的類,實現(xiàn)不同的功能。兩個有什么區(qū)別呢,怎么取舍呢,沒有自己寫過實際的運用,有點暈啊,只能侃侃,耍耍嘴皮子。
從客戶端來看,簡單工廠需要至少需要兩個類,一個是工廠類Factory,用來產(chǎn)生具體的功能類Function,一個是這個Function類,在這個Function類中定義可以被要被重寫的方法。客戶端使用的時候首先要使用Factory類根據(jù)客戶端條件,產(chǎn)生具體的Function類,然后再使用Function類中的方法實現(xiàn)具體的功能;策略類,在客戶端也要接觸兩個類,一個是想要的具體算法類Category,一個是上下文類Context,Context類的構(gòu)造方法接受一個Category類型對象,然后調(diào)用這個對象的具體算法實現(xiàn)具體的功能,Context類和Factory有點類似,和簡單工廠模式不同的是Context接受一個對象,用這個對象來實例化自己,然后來調(diào)用自己的方法,當然這個方法是用這個對象中的方法。而Factory類接受條件產(chǎn)生一個對象,具體使用這個對象的方法還是要調(diào)用這個對象中的方法,而不是Factory中的方法。就是說Factory只負責獲得對象,Context要依靠一個具體的對象來實例化自己,并調(diào)用具體的功能方法。
從類的結(jié)構(gòu)來看Factory只要包含一個根據(jù)條件創(chuàng)建對象的方法CreateFunction(),Context類需要定義自己的構(gòu)造函數(shù),和一個實現(xiàn)具體功能的方法。
簡單工廠中包含了必要的邏輯判斷,根據(jù)客戶端選擇條件動態(tài)實例化相關(guān)的類。策略模式中具體的策略類要在客戶端判斷,然后再上下文類中調(diào)用方法。
簡單工廠代碼如下:
代碼
{
public static Function CreateObject(string condition)
{
Function ft = null;
switch condition:
case conditionA:
{
ft = new FunctionA();
break;
}
case conditionB:
{
ft = new FunctionB();
break;
}
}
}
public calss Function
{
public virtual void DoSomething()
{
.... ....
}
}
public class FunctionA:Function
{
public void override DoSomething()
{
.... ...
}
}
public calss FuctionB:Function
{
public void override DoSomething()
{
.... ....
}
}
public static void main()
{
string condition = "asdfasdf";
Function fc = Factory.CreateObject(condition);
fc.DoSomething();
}
策略模式代碼如下:
代碼
{
private Strategy st;
public Context(Strategy st)
{
this.st = st;
}
public void DoStragegyWork()
{
st.DoSomeWork();
}
}
abstract class Strategy
{
public abstract void DoSomeWork();
}
public class StrategyA:Strategy
{
public override void DoSomeWork()
{ A... ... }
}
public class StrategyB:Strategy
{
public override void DoSomeWork()
{ B... ... }
}
public static void main(string args[])
{
StrategyB sb = new StrategyB();
Context ct = new Context(sb);
ct.DoStragegyWork();
}
可以讓策略模式和簡單工廠模式結(jié)合起來,讓new Context(sb);這個構(gòu)造方法接受一個條件變量,在方法體中根據(jù)這個變量產(chǎn)生具體的類來實例化。
具體方法如下:
代碼
{
private Strategy st;
public Context(string condition)
{
switch("conditionA")
this.st = new StrategyA();
break;
switch("conditionB")
this.st = new StrategyB();
break;
default:
break;
}
public void DoStragegyWork()
{
st.DoSomeWork();
}
}
abstract class Strategy
{
public abstract void DoSomeWork();
}
public class StrategyA:Strategy
{
public override void DoSomeWork()
{ A... ... }
}
public class StrategyB:Strategy
{
public override void DoSomeWork()
{ B... ... }
}
public static void main(string args[])
{
StrategyB sb = new StrategyB();
Context ct = new Context(sb);
ct.DoStragegyWork();
}
哪位大俠可以舉個在項目中的運用,貼點簡單的代碼看看,先謝謝了。我這些都是從書本里得來的。
作者:Tyler Ning
出處:http://www.rzrgm.cn/tylerdonet/
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,如有問題,請微信聯(lián)系冬天里的一把火

浙公網(wǎng)安備 33010602011771號