在介紹完簡單工廠與工廠模式後,
一個是有一個中央工廠,
而另一個是每一個工廠都要獨立出來,
有時候會有一種需求,
但會有多種狀況,
如果要一個個都定好,
那麼就會需要多個工廠。
這時候就會需要延伸一點定義,
說到廣泛的定義,
就會想到抽象,
筆者常說抽象是一個廣泛的定義,
那麼抽象工廠,就是一種廣泛的定義工廠
舉個例子,如果一件件事情都用工廠來區分,
那麼就會有汽車輪胎、摩特車輪胎、飛機輪胎等等的工廠,
但除了各種外在條件限制,導致的耐壓、耐磨等等的不同,
其實他都可以被一間工廠所定義好,
也就是一家輪胎工廠可以負責的,
而不用各種載具的輪胎,甚至細到某種廠牌的輪胎等等的,
這就是抽象工廠所要做的。
抽象工廠模式(Abstract Factory Pattern)
是一種軟體設計模式,同樣屬於創建型模式。它提供了一種創建一系列相關或相互依賴的物件的方式,而無需指定其具體的類別。
抽象工廠模式包含以下幾個主要元素:
抽象工廠(Abstract Factory):提供了創建產品的接口,包含多個創建產品的方法,可創建不同產品。
具體工廠(Concrete Factory):主要是實作抽象工廠中的抽象方法,完成實體產品的建立。
產品(Product):定義產品的規範、特性及功能,可以有多個抽象產品。
具體產品(Concrete Product):實作抽象產品,實體由工廠建立,和實體工廠是多對一的關係。
轉換成程式的話
#region 抽象產品
public interface ITire
{
void Produce();
}
#endregion
#region 具體產品
#region 具體產品-摩托車輪胎
public class MotorbikeTire : ITire
{
public void Produce()
{
Console.WriteLine("生產摩托車輪胎");
}
}
#endregion
#region 具體產品-飛機輪胎
public class PlaneTire : ITire
{
public void Produce()
{
Console.WriteLine("生產飛機輪胎");
}
}
#endregion
#region 具體產品-汽車輪胎
// 具體產品
public class CarTire : ITire
{
public void Produce()
{
Console.WriteLine("生產汽車輪胎");
}
}
public class ReinforcedCarTire : CarTire
{
public new void Produce()
{
Console.WriteLine("生產加強汽車輪胎");
}
}
public class WearResistantCarTire : CarTire
{
public new void Produce()
{
Console.WriteLine("生產耐磨汽車輪胎");
}
}
#endregion
#endregion
#region 抽象工廠
public interface IAbstractFactory
{
ITire CreateTire();
}
#endregion
#region 具體工廠
#region 具體工廠-汽車輪胎
public class CarFactory : IAbstractFactory
{
public ITire CreateTire()
{
return new CarTire();
}
}
public class ReinforcedCarFactory : IAbstractFactory
{
public ITire CreateTire()
{
return new ReinforcedCarTire();
}
}
public class WearResistantCarFactory : IAbstractFactory
{
public ITire CreateTire()
{
return new WearResistantCarTire();
}
}
#endregion
#region 具體工廠-摩托車輪胎
public class MotorbikeFactory : IAbstractFactory
{
public ITire CreateTire()
{
return new MotorbikeTire();
}
}
#endregion
#region 具體工廠-飛機輪胎
public class PlaneFactory : IAbstractFactory
{
public ITire CreateTire()
{
return new PlaneTire();
}
}
#endregion
#endregion
class Program
{
static void Main(string[] args)
{
// 生產汽車輪胎
Client(new CarFactory());
// 生產加強汽車輪胎
Client(new ReinforcedCarFactory());
// 生產耐磨汽車輪胎
Client(new WearResistantCarFactory());
// 生產摩托車輪胎
Client(new MotorbikeFactory());
// 生產飛機輪胎
Client(new PlaneFactory());
}
static void Client(IAbstractFactory factory)
{
var tire = factory.CreateTire();
tire.Produce();
}
}
在這邊可以看到,
抽象工廠模式用了寬度的汽車輪胎、摩特車輪胎、飛機輪胎等等,
筆者也試著透過汽車輪胎進行深度延伸,
這也是一個抽象工廠的特性,
這些都是抽象工廠常見的狀態。