一、 Factory 方法(Factory Method)模式
Factory 方法(FactoryMethod)模式是類的建立模式,其用意是定義一個建立產品對象的工廠介面,將實際建立工作延遲到子類中。
Factory 方法模式是簡單原廠模式的進一步抽象和推廣。由於使用了多態性,Factory 方法模式保持了簡單原廠模式的優點,而且克服了它的缺點。
在Factory 方法模式中,核心的工廠類不再負責所有產品的建立,而是將具體建立工作交給子類去做。這個核心類僅僅負責給出具體工廠必須實現的介面,而不接觸哪一個產品類被執行個體化這種細節。這使得Factory 方法模式可以允許系統在不修改工廠角色的情況下引進新產品。
在Factory Method模式中,工廠類與產品類往往具有平行的等級結構,它們之間一一對應。
二、 Factory Method模式角色與結構:
抽象工廠(Creator)角色:是Factory 方法模式的核心,與應用程式無關。任何在模式中建立的對象的工廠類必須實現這個介面。
具體工廠(Concrete Creator)角色:這是實現抽象工廠介面的具體工廠類,包含與應用程式密切相關的邏輯,並且受到應用程式調用以建立產品對象。在中有兩個這樣的角色:BulbCreator與TubeCreator。
抽象產品(Product)角色:Factory 方法模式所建立的對象的超類型,也就是產品對象的共同父類或共同擁有的介面。在中,這個角色是Light。
具體產品(Concrete Product)角色:這個角色實現了抽象產品角色所定義的介面。某具體產品有專門的具體工廠建立,它們之間往往一一對應。
三、 程式舉例:
using System;
namespace FactoryMethodQucikStart
{
/**//// <summary>
/// Summary description for FactoryMethod.
/// </summary>
public abstract class Light
{
public abstract void TurnOn();
public abstract void TurnOff();
}
//燈泡
public class BulbLight : Light
{
public override void TurnOn()
{
Console.Write("Bulb Light Turned on");
System.Diagnostics.Debug.Write("Bulb Light Turned on");
}
public override void TurnOff()
{
Console.Write("Bulb Light Turned off");
System.Diagnostics.Debug.Write("Bulb Light Turned off");
}
}
//日光燈
public class TubeLight : Light
{
public override void TurnOn()
{
Console.Write("TubeLight Turned on");
System.Diagnostics.Debug.Write("TubeLight Turned on");
}
public override void TurnOff()
{
Console.Write("TubeLight Turned off");
System.Diagnostics.Debug.Write("TubeLight Turned off");
}
}
//Factory 方法(FactoryMethod)模式是類的建立模式,
//其用意是定義一個建立產品對象的工廠介面,將實際建立工作延遲到子類中。
public abstract class Creator
{
public abstract Light factory();
}
public class BulbCreator : Creator
{
public override Light factory()
{
return new BulbLight();
}
}
public class TubeCreator : Creator
{
public override Light factory()
{
return new TubeLight();
}
}
}
用戶端調用: //建立BulbCreator
Creator c1 = new BulbCreator();
//建立TubeCreator
Creator c2 = new TubeCreator();
//用戶端調用BulbCreator的factory方法
FactoryMethodQucikStart.Light l1 = c1.factory();
//用戶端調用BulbCreator的factory方法
FactoryMethodQucikStart.Light l2 = c2.factory();
l1.TurnOn();
l1.TurnOff();
l2.TurnOn();
l2.TurnOff();
廠方法的活動順序圖表
活動過程包括:
用戶端建立BulbCreator對象,用戶端持有此對象的類型是Creator,而實際類型是BulbCreator。然後用戶端調用BulbCreator的factory方法,之後BulbCreator調用BulbLight的建構函式創造出產品BulbLight對象。
四、 Factory 方法模式與簡單原廠模式
Factory 方法模式與簡單原廠模式再結構上的不同不是很明顯。Factory 方法類的核心是一個抽象工廠類,而簡單原廠模式把核心放在一個具體類上。
Factory 方法模式之所以有一個別名叫多態性原廠模式是因為具體工廠類都有共同的介面,或者有共同的抽象父類。
當系統擴充需要添加新的產品對象時,僅僅需要添加一個具體對象以及一個具體工廠對象,原有工廠對象不需要進行任何修改,也不需要修改用戶端,很好的符合了"開放-封閉"原則。而簡單原廠模式在添加新產品對象後不得不修改Factory 方法,擴充性不好。
Factory 方法模式退化後可以演變成簡單原廠模式。