設計模式-工廠方法模式(Factory Method Pattern)
工廠方法模式(Factory Method):將建立一個產品的任務,推遲到子類中。核心工廠類不再負責產品的建立。
這樣核心類成為一個抽象工廠。負責具體子類工廠必須實現的介面。這樣的好處是在不改變具體子類工廠的前提下
增加新的產品。
工廠方法模式角色與結構:
抽象工廠角色(AbstractFactory):是工廠方法模式的核心,建立的子類工廠必須實現這個介面。
具體工廠角色(Concrete Creator):實現抽象工廠的具體工廠類,包含與應用程式密切相關的邏輯,
並且受到應用程式呼叫建立產品物件。如ProductAFactory,ProductBFactory
抽象產品角色(Product):工廠方法模式建立的物件的基類或者介面。
具體產品角色(Concrete Product):實現了抽象產品角色的具體類。其物件由具體工廠建立產生。他們之間一般為一一對應。
程式碼:
/// <summary>
/// 抽象工廠
/// </summary>
public abstract class AbstractFactory
{
public abstract Product Factory();
}
/// <summary>
/// 產品A的建立工廠
/// </summary>
public class ProductAFactory:AbstractFactory
{
public override Product Factory()
{
return new ConcreteProductA();
}
}
/// <summary>
/// 產品B的建立工廠
/// </summary>
public class ProductBFactory : AbstractFactory
{
public override Product Factory()
{
return new ConcreteProductB();
}
}
/// <summary>
/// 產品抽象類
/// </summary>
public abstract class Product
{
/// <summary>
/// 唯一標識
/// </summary>
public string ID
{
get;
set;
}
/// <summary>
/// 產品名稱
/// </summary>
public string Name
{
get;
set;
}
public abstract void Operate();
public void GetName()
{
Console.WriteLine("the name of Product is "+Name);
}
}
/// <summary>
/// 產品A
/// </summary>
public class ConcreteProductA : Product
{
public override void Operate()
{
Console.WriteLine("this is the Class if ConcreteProductA");
}
}
/// <summary>
/// 產品B
/// </summary>
public class ConcreteProductB : Product
{
public override void Operate()
{
Console.WriteLine("this is the Class if ConcreteProductB");
}
}
class Program
{
static void Main(string[] args)
{
#region 工廠方法模式
AbstractFactory factoryA = null; // 工廠A
Product productA = null; // 產品A
factoryA = new ProductAFactory();
productA = factoryA.Factory();
productA.Name = "ProductA";
productA.Operate();
productA.GetName();
AbstractFactory factoryB = null; // 工廠B
Product productB = null; // 產品B
factoryB = new ProductBFactory();
productB = factoryB.Factory();
productB.Name = "ProductB";
productB.Operate();
productB.GetName();
return;
}
}