抽象工廠 提供一個介面,用於建立 相關或相依物件家族 的具體實例,而無需指定其具體類別。本例模擬電腦組裝:Computer 由 RAM 與 CPU 組成,PC 與 Mac 為兩個產品家族,各自有對應的 PcRAM/PcCPU、MacRAM/MacCPU。
RAM, CPU (抽象基底類別)。PcRAM, PcCPU, MacRAM, MacCPU。AbstractFactory (宣告 CreateRam(), CreateCpu())。PcFactory, MacFactory。ITMarket (使用工廠建立產品並組裝)。
using System;
// 產品抽象基底
public abstract class RAM
{
public abstract Computer ComposeComputer(CPU cpu);
}
public abstract class CPU
{
public abstract Computer ComposeComputer(RAM ram);
}
// 產品:電腦 (由 RAM + CPU 組合)
public class Computer
{
private readonly RAM _ram;
private readonly CPU _cpu;
public Computer(RAM ram, CPU cpu)
{
_ram = ram; _cpu = cpu;
Console.WriteLine($"Computer assembled: {_ram.GetType().Name} + {_cpu.GetType().Name}");
}
}
// PC 家族具體產品
public class PcRAM : RAM
{
public override Computer ComposeComputer(CPU cpu)
{
Console.WriteLine("PC Computer assembling...");
return new Computer(this, cpu);
}
}
public class PcCPU : CPU
{
public override Computer ComposeComputer(RAM ram)
{
Console.WriteLine("PC Computer assembling...");
return new Computer(ram, this);
}
}
// Mac 家族具體產品
public class MacRAM : RAM
{
public override Computer ComposeComputer(CPU cpu)
{
Console.WriteLine("Mac Computer assembling...");
return new Computer(this, cpu);
}
}
public class MacCPU : CPU
{
public override Computer ComposeComputer(RAM ram)
{
Console.WriteLine("Mac Computer assembling...");
return new Computer(ram, this);
}
}
// 抽象工廠
public abstract class AbstractFactory
{
public abstract RAM CreateRam();
public abstract CPU CreateCpu();
}
// 具體工廠
public class PcFactory : AbstractFactory
{
public override RAM CreateRam() => new PcRAM();
public override CPU CreateCpu() => new PcCPU();
}
public class MacFactory : AbstractFactory
{
public override RAM CreateRam() => new MacRAM();
public override CPU CreateCpu() => new MacCPU();
}
// 客戶端:IT 市場通道
public class ITMarket
{
private readonly RAM _ram;
private readonly CPU _cpu;
public ITMarket(AbstractFactory factory)
{
_ram = factory.CreateRam();
_cpu = factory.CreateCpu();
}
public void Run()
{
_ram.ComposeComputer(_cpu); // 雙向組裝示範
_cpu.ComposeComputer(_ram);
}
}
// 程式進入點
public class ClientApp
{
public static void Main()
{
Console.WriteLine("=== PC Factory ===");
var pcMarket = new ITMarket(new PcFactory());
pcMarket.Run();
Console.WriteLine("\n=== Mac Factory ===");
var macMarket = new ITMarket(new MacFactory());
macMarket.Run();
}
}
=== PC Factory ===
PC Computer assembling...
Computer assembled: PcRAM + PcCPU
PC Computer assembling...
Computer assembled: PcRAM + PcCPU
=== Mac Factory ===
Mac Computer assembling...
Computer assembled: MacRAM + MacCPU
Mac Computer assembling...
Computer assembled: MacRAM + MacCPU
PcFactory 保證產出的 RAM/CPU 皆為 PC 規格,避免混用 Mac 組件。ServerFactory) 僅需新增具體工廠與產品類別,不修改 現有 ITMarket 或抽象介面。ITMarket) 僅依賴抽象介面 (AbstractFactory, RAM, CPU),與具體實作無關。抽象工廠模式以「工廠介面 + 產品家族」結構,優雅解決跨平台/多風格物件建立問題。C# 介面與多型特性使其實作自然且型別安全。