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));
}

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 melomelo1988 的頭像
    melomelo1988

    melo 唐

    melomelo1988 發表在 痞客邦 留言(0) 人氣()