目錄
- 定義
- UML
- 參與者
- 樣本
定義:
定義一個建立對象的介面,但是讓子類來決定哪個類將被執行個體化。Factory 方法讓一個類執行個體化延遲到子類。
UML:
參與者:
產品(Project)角色:定義一個產品的介面。
具體產品(ConcreteProduct)角色: 實現這個產品角色介面的具體類。
工廠(Factory)角色:定義一個介面,用來建立產品。
具體工廠(ConcreteFactory)角色:實現工廠角色介面的具體類。
樣本
代碼using System; namespace DoFactory.GangOfFour.Factory.Structural{ /// <summary> /// MainApp startup class for Structural /// Factory Method Design Pattern. /// </summary> class MainApp { /// <summary> /// Entry point into console application. /// </summary> static void Main() { // An array of creators Creator[] creators = new Creator[2]; creators[0] = new ConcreteCreatorA(); creators[1] = new ConcreteCreatorB(); // Iterate over creators and create products foreach (Creator creator in creators) { Product product = creator.FactoryMethod(); Console.WriteLine("Created {0}", product.GetType().Name); } // Wait for user Console.ReadKey(); } } /// <summary> /// The 'Product' abstract class /// </summary> abstract class Product { } /// <summary> /// A 'ConcreteProduct' class /// </summary> class ConcreteProductA : Product { } /// <summary> /// A 'ConcreteProduct' class /// </summary> class ConcreteProductB : Product { } /// <summary> /// The 'Creator' abstract class /// </summary> abstract class Creator { public abstract Product FactoryMethod(); } /// <summary> /// A 'ConcreteCreator' class /// </summary> class ConcreteCreatorA : Creator { public override Product FactoryMethod() { return new ConcreteProductA(); } } /// <summary> /// A 'ConcreteCreator' class /// </summary> class ConcreteCreatorB : Creator { public override Product FactoryMethod() { return new ConcreteProductB(); } }}
Output:
Created ConcreteProductA
Created ConcreteProductB
實際運用:
代碼 /// <summary> /// 產品介面 /// </summary> public interface ICar { void OpenDoor(); } /// <summary> /// 寶馬車 /// </summary> public class BaoMaCar : ICar { public void OpenDoor() { Console.WriteLine("開啟寶馬車門"); } } /// <summary> /// 奧迪車 /// </summary> public class AodiCar : ICar { public void OpenDoor() { Console.WriteLine("開啟奧迪車門"); } }/// <summary> /// 工廠介面,用來建立哪個車 /// </summary> public interface IFactory { ICar Create(); }/// <summary> /// 寶馬工廠 /// </summary> public class BaoMaFactory : IFactory { public ICar Create() { return new BaoMaCar(); } } /// <summary> /// 奧迪工廠 /// </summary> public class AoDiFactory : IFactory { public ICar Create() { return new AodiCar(); } } static void Main(string[] args) { IFactory factory = new AoDiFactory(); ICar car = factory.Create(); car.OpenDoor(); Console.Read(); }
OutPut:
開啟奧迪車門