1. Factory Design Pattern
定義:定義一個建立物件之介面(Interface or Abstract Class),由次類別決定實體化(建立此類別之Instance)的類別為何者
工廠方法讓類別實體化的動作交給次類別去進行。
2. UML Diagram
<Interface> Product & Concreate Product : 所有的Concreate Product(產品)都必須實踐這個共同介面,如此使用Concreate Product(產品)的時候只要利用此介面來操作產品,不需要知道真正的產品。
Creator : 是一個抽象類別或類別,實踐所有處理Concreate Product的方法(可能有或沒有OtherOperation()),但不實踐FactoryMethod():因為這是用來建立類別 Instance用的。
Concrete Creator : Concrete Creator實踐FactoryMethod(),實際製造出Concreate Product(產品)的Instance。
3. Example
產品介面:
// Product Interface
public interface IFactory
{
string Drive(int miles);
}
產品: 實做 Product Interface,到時候產生產品的Instance就可以不需要知道真正的產品為何,就是直接對介面實做。
// ConcreateProduct class
//輕型機車
public class Scooter : IFactory
{
public string Drive(int miles)
{
return "Scooter" + miles.ToString();
}
}
//腳踏車
public class Bike : IFactory
{
public string Drive(int miles)
{
return "Bike" + miles.ToString();
}
}
Creator : 是一個抽象類別或類別,實踐所有處理產品的方法(OtherOperation(),可有可無),但不實踐FactoryMethod():因為這是用來建立類別實利用的。
//Creator Abstract class
public abstract class VehicleFactory
{
//抽像工廠方法FactoryMethod(GetVehicle),由ConcreteVehicleFactory 實踐 , 此抽像方法之型別為:IFactory 介面
public abstract IFactory GetVehicle(string Vehicle);
}
Concrete Creator : Concrete Creator實踐FactoryMethod(),實際製造出Concreate Product(產品)。
public class ConcreteVehicleFactory : VehicleFactory
{
//覆寫虛擬工廠方法,實際製造出產品instance
public override IFactory GetVehicle(string Vehicle)
{
switch (Vehicle)
{
case "Scooter":
return new Scooter();
case "Bike":
return new Bike();
default:
throw new ApplicationException(string.Format("Vehicle '{0}' cannot be created", Vehicle));
}
}
}
web.cs
protected void Page_Load(object sender, EventArgs e)
{
//建立一個Creator型別之物件factory,為了給下一行呼叫工廠方法:GetVehicle()
VehicleFactory factory = new ConcreteVehicleFactory();
//對介面實做Instance
IFactory scooter = factory.GetVehicle("Scooter");
Response.Write(scooter.Drive(15));
}