簡單工廠和工廠方法的區別
在《簡單工廠模式和策略模式的區別》中說道簡單工廠中用一個Factory類來專門負責產生具體的類,在添加一個功能的時候要做兩個動作,一是添加一個FunctionC類繼承自Function類,二是要修改Factory類的CreateObject方法。
代碼如下:
代碼
{
public static Function CreateObject(string condition)
{
Function ft = null;
switch condition:
case conditionA:
{
ft = new FunctionA();
break;
}
case conditionB:
{
ft = new FunctionB();
break;
}
case conditionC: //修改了CreateObject方法
{
ft = new FunctionC();
break;
}
default:
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 calss FuctionC:Function
{
public void override DoSomething()
{
.... ....
}
}
public static void main()
{
string condition = "asdfasdf";
Function fc = Factory.CreateObject(condition);
fc.DoSomething();
}
這樣看起來也很方便,但是軟件設計里面有個原則開放封閉原則,對于擴展開放,對于修改封閉。這里修改了CreateObject()方法,做項目的時候發現只要修改就會有可能出錯誤,可能就是這個道理吧。這樣就誕生了工廠方法模式。
工廠方法模式省去了原來的Factory類,不用這個類來生產對象,但是使用一系列的工廠類來專門負責產生相應的類。在客戶端要想使用這個功能類,首先要獲得它的工廠類,由這個工廠類來產生相應的功能類。這樣添加一個功能的時候也要做兩個工作,一是添加相應的功能類,二是添加一個工廠類。工廠方法模式定義一個用于創建對象的工廠接口IFactory,讓這個接口的子類FactoryA,FactoryB決定實例化具體的功能類,而不是想簡單工廠中那樣直接在工廠類Factory中決定。
工廠方法代碼如下:
代碼
{
Function CreateFunction(); //工廠接口的功能:產生功能類
}
class FactoryA:IFactory
{
public override CreateFunction()
{
return new FunctionA();
}
}
class FactoryB:IFactory
{
public override CreateFunction()
{
return new FunctionB();
}
}
//去掉原來的工廠類
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()
{
IFactory ifactory = new FactoryA(); //根據要實例化的功能類選擇工廠類
FunctionA fa = ifactory.CreateFunction();//工廠類實例化具體的功能類
fa.DoSomething();
}
簡單工廠類也可以實現這樣的功能,就是要修改原來的Factory類,在工廠方法模式里面要添加一個功能,需要擴展一個FuctionB:Function,還要擴展一個FactoryB:IFactory,避免了修改,開放了擴展。
作者:Tyler Ning
出處:http://www.rzrgm.cn/tylerdonet/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,如有問題,請微信聯系冬天里的一把火

浙公網安備 33010602011771號