工廠方法(Factory Method)模式就是定義一個建立對象的工廠接口,将實際建立工作推遲到子類當中。
核心工廠類不再負責具體産品的建立,僅提供了具體工廠子類必須實作的接口,這樣核心類成為一個抽象工廠角色,這樣做的好處是工廠方法模式可以使系統在不修改具體工廠角色的情況下進行引進新的産品。
在Factory Method模式中,工廠類與産品類往往具有平行的等級結構,它們之間一一對應。
從上圖可以看出,工廠方法模式有四個角色:
抽象工廠角色(ICreator):是工廠方法模式的核心,與應用程式無關。任何在模式中建立對象的工廠類必須實作這個接口。
具體工廠(Concrete Creator)角色: 這是實作抽象工廠接口的具體工廠類,包含與應用程式密切相關的邏輯,并且受到應用程式調用以建立産品對象,在上圖中有兩個這些的角色:BulbCreator與TubeCreator.
抽象産品(Product)角色:工廠方法模式所建立對象的接口,也就是産品對象的共同接口。在上圖中就是ILight。
具體産品(Concrete Product)角色: 這個角色實作了抽象産品角色多定義的接口,具體産品有專門的具體工廠建立,它們之間往往一一對應。
具體實作代碼如下:
public interface ICreator
{
ILight Factory();
}
public interface ILight
void TurnOn();
void TurnOff();
public class TubeLight : ILight
public void TurnOn()
{
Console.WriteLine("TubeLight TurnOn");
}
public void TurnOff()
Console.WriteLine("TubeLight TurnOff");
public class BulbLight : ILight
Console.WriteLine("BulbLight TurnOn");
Console.WriteLine("BulbLight TurnOff");
public class BulbCreator : ICreator
public ILight Factory()
return new BulbLight();
public class TubeCreator : ICreator
return new TubeLight();
public class Test
public static void Main()
ICreator create1 = new BulbCreator();
ILight light = create1.Factory();
light.TurnOn();
light.TurnOff();
create1 = new TubeCreator();
light = create1.Factory();
工廠方法模式與簡單工廠模式在結構上差別是:工廠方法類的核心是一個抽象工廠類,而簡單工廠模式把核心放在一個具體類上。
工廠方法模式的具體工廠類都有一個共同的接口,是以工廠方法模式也叫多态性工廠模式。
當系統擴充需要添加新的産品對象時,僅僅需要添加一個具體對象以及一個具體工廠對象,原有工廠對象不需要進行任何修改,很好的符合了“開放封閉“原則。而簡單工廠模式在添加新産品對象後不得不修改工廠方法,擴充性不好。
工廠方法模式退化後可以演變成簡單工廠模式。