1.概述
在軟體系統中,經常面臨著“某個對象”的建立工作,由於需求的變化,這個對象的具體實現經常面臨著劇烈的變化,但是它卻擁有比較穩定的介面。如何應對這種變化?提供一種封裝機制來隔離出“這個易變對象”的變化,從而保持系統中“其它依賴該對象的對象”不隨著需求的改變而改變?這就是要說的Factory Method模式了。
Factory 方法模式(Factory Method),定義一個用於建立對象的介面,讓子類決定執行個體化那個類。Factory 方法使一個類的執行個體化延遲到其子類。這個借口所指的是一個抽象方法,該方法說明需要建立一個對象,但並不給出具體的的建立方法和建立什麼類型的對象。
Factory 方法的使用場合:當一個類不知道他所必須建立對象的類或一個類希望由子類來指定他所建立的對象時,可以使用Factory 方法。
Factory 方法模式結構圖:
圖中表示表示Factory 方法的部分只是FactoryMethod()。在Creator中定義這個方法的介面,在ConcreteProduct中實現這個方法。如果沒有這個方法就沒有Factory 方法模式。Creator的職責並非只是建立一個產品,他經常同是包含有模板方法,及模式僅限於方法部分,這也就是為什麼叫做“Factory 方法”的原因。
Factory 方法使類中的代碼不依賴於他必須建立的類,代碼只要知道他需要建立類的介面。Factory 方法的缺點是新增加一個需要建立的類,就需要增加一個相應的子類。
2.執行個體
1)大話設計模式中的計算機Factory 方法模式實現
計算機的Factory 方法模式實現結構圖如:
代碼:
Operation基類:
public abstract class Operation
{
private double _numbleA = 0;
private double _numbleB = 0;
public double NumbleA
{
get { return _numbleA; }
set { _numbleA = value; }
}
public double NumbleB
{
get { return _numbleB; }
set { _numbleB = value; }
}
public virtual double GetResult()
{
double Result = 0;
return Result;
}
}
三個子類:
public class OperationAdd : Operation
{
public override double GetResult()
{
double Result = 0;
Result = NumbleA + NumbleB;
return Result;
}
}
public class OperationMul : Operation
{
public override double GetResult()
{
double Result = 0;
Result = NumbleA + NumbleB;
return Result;
}
}
public class OprationSub : Operation
{
public override double GetResult()
{
double Result = 0;
Result = NumbleA + NumbleB;
return Result;
}
}
抽象Factory 方法:
public abstract class OperationFactory
{
public abstract Operation CreateOpreation();
}
三個具體Factory 方法:
public class AddFactory : OperationFactory
{
public override Operation CreateOpreation()
{
return new OperationAdd();
}
}
public class MulFactory : OperationFactory
{
public override Operation CreateOpreation()
{
return new OperationMul();
}
}
public class SubFactory : OperationFactory
{
public override Operation CreateOpreation()
{
return new OprationSub();
}
}
用戶端的實現:
static void Main(string[] args)
{
OperationFactory operFactory = new AddFactory();
Operation oper = operFactory.CreateOpreation();
oper.NumbleA = 5;
oper.NumbleB = 4;
double result = oper.GetResult();
Console.WriteLine("結果:{0}",result);
Console.ReadLine();
}
3.總結
Factory 方法模式與簡單原廠模式再結構上的不同不是很明顯。Factory 方法類的核心是一個抽象工廠類,而簡單原廠模式把核心放在一個具體類上。Factory 方法模式之所以有一個別名叫多態性原廠模式是因為具體工廠類都有共同的介面,或者有共同的抽象父類。當系統擴充需要添加新的產品對象時,僅僅需要添加一個具體對象以及一個具體工廠對象,原有工廠對象不需要進行任何修改,也不需要修改用戶端,很好的符合了"開放-封閉"原則。而簡單原廠模式在添加新產品對象後不得不修改Factory 方法,擴充性不好。Factory 方法模式退化後可以演變成簡單原廠模式。Factory 方法模式退化後可以演變成簡單原廠模式。
適用於Factory 方法模式:
當一個類不知道它所必須建立的對象的類的時候;當一個類希望由它的子類來指定它所建立的對象的時候;當類將建立對象的職責委託給多個協助子類中的某一個,並且你希望將哪一個協助子類是代理者這一資訊局部化的時候。
Factory 方法克服了簡單工廠違背開放封閉原則的缺點,又保持了分裝對象建立過程的優點,Factory 方法模式是簡單原廠模式的進一步抽象和推廣。由於使用了多態性,Factory 方法模式保持了簡單原廠模式的優點,而且克服了他的缺點。缺點就是由於每增加一個產品,就需要加一個產品工廠類。
轉載自:http://www.cnblogs.com/peida/archive/2008/06/08/1215502.html