設計模式系列
抽象工廠
定義:提供一個建立一系列相關或互相依賴物件的介面,而無需指定它們具體的類別。
解釋:透過定義一個抽象類別或介面(即抽象工廠),規範制定一整套創造抽象物件的方法,以至於在實際
方法內容在繼承了抽象工廠的實體工廠中實作,並透過多型的能力以統一的抽象工廠外貌來操作不
同實體工廠的實體化方法,以在不依賴實作類別的情況下創建出不同的物件實體。由於實體工廠了
解自己要產出的實體類別,在繼承的方法中使用new來實體化需要的實體類別,並以抽象類別的外
貌從實體工廠中傳遞出去。增加了實體類別中關於創建物件實體的內聚性,降低了類別之間依賴不
同物件 類型的耦合性。
精神:抽象實體化物件的過程。
目的:避免為了實例化新的類別而去修改原有的實例化程式碼(像是用switch來實體化不同的類別),以遵守
開閉原則。
使用時機:當有一系列繼承於某個類型(無論抽象或實體)的類型的實體化過程繁複而且相關(不一定只有產品
類別本身的實體化,相關的配件實體化的部分也應該放在同一個工廠中)時。
優點:抽象分離、增強内聚性與降低耦合程度。
缺點:需要實作各自的實體工廠,類別數量會增多。而且若要擴充抽象工廠的實例方法需要修改所有繼承的
類別。
class Program
{
private static void Main(string[] args)
{
AbstractFactory factory1 = new ConcreteFacotry1();
Clinet clinet1 = new Clinet(factory1);
clinet1.Run();
AbstractFactory factory2 = new ConcreteFactory2();
Clinet clinet2 = new Clinet(factory2);
clinet2.Run();
Console.ReadLine();
}
}
abstract class AbstractFactory
{
public abstract AbstractProductA CreateProductA();
public abstract AbstractProductB CreateProductB();
}
class ConcreteFacotry1:AbstractFactory
{
public override AbstractProductA CreateProductA()
{
return new ProductA1();
}
public override AbstractProductB CreateProductB()
{
return new ProductB1();
}
}
class ConcreteFactory2:AbstractFactory
{
public override AbstractProductA CreateProductA()
{
return new ProductA2();
}
public override AbstractProductB CreateProductB()
{
return new ProductB2();
}
}
abstract class AbstractProductA
{
}
abstract class AbstractProductB
{
public abstract void Interact(AbstractProductA a);
}
class ProductA1 : AbstractProductA
{
}
class ProductB1 : AbstractProductB
{
public override void Interact(AbstractProductA a)
{
Console.WriteLine(this.GetType().Name + " interacts with " + a.GetType().Name);
}
}
class ProductA2 : AbstractProductA
{
}
class ProductB2 : AbstractProductB
{
public override void Interact(AbstractProductA a)
{
Console.WriteLine(this.GetType().Name + " interacts with " + a.GetType().Name);
}
}
class Clinet
{
private AbstractProductA abstractProductA;
private AbstractProductB abstractProductB;
public Clinet(AbstractFactory factory)
{
abstractProductA = factory.CreateProductA();
abstractProductB = factory.CreateProductB();
}
public void Run()
{
abstractProductB.Interact(abstractProductA);
}
}
元哥的筆記