抽象工廠模式提供一個介面,用於建立相關或相依物件的家族,而不需要指定它們的具體類別。本範例以「樣式家族」為例:字型樣式與表格樣式必須搭配使用(StyleA 或 StyleB)。
FontsStyle、TablesStyleFontsStyleA/B、TablesStyleA/BStyleFactory 定義 CreateFontsStyle()、CreateTablesStyle()StyleA、StyleBHomePage 接受工廠建構,組合產品產出 HTMLusing System;
// 抽象產品
abstract class FontsStyle { public string StyleString; }
abstract class TablesStyle { public string StyleString; }
// 具體產品
class FontsStyleA : FontsStyle { public FontsStyleA() { StyleString = "FontsStyleA"; } }
class FontsStyleB : FontsStyle { public FontsStyleB() { StyleString = "FontsStyleB"; } }
class TablesStyleA : TablesStyle { public TablesStyleA() { StyleString = "TablesStyleA"; } }
class TablesStyleB : TablesStyle { public TablesStyleB() { StyleString = "TablesStyleB"; } }
// 抽象工廠
abstract class StyleFactory
{
public abstract FontsStyle CreateFontsStyle();
public abstract TablesStyle CreateTablesStyle();
}
// 具體工廠
class StyleA : StyleFactory
{
public override FontsStyle CreateFontsStyle() => new FontsStyleA();
public override TablesStyle CreateTablesStyle() => new TablesStyleA();
}
class StyleB : StyleFactory
{
public override FontsStyle CreateFontsStyle() => new FontsStyleB();
public override TablesStyle CreateTablesStyle() => new TablesStyleB();
}
// 客戶端:使用工廠建立產品家族
class HomePage
{
private FontsStyle _fonts;
private TablesStyle _tables;
private string _html = "<html><body><table style='tablesstyle'><tr><td><font style='fontsstyle'>HelloWorld!</font></td></tr></table></body></html>";
public HomePage(StyleFactory factory)
{
_fonts = factory.CreateFontsStyle();
_tables = factory.CreateTablesStyle();
_html = _html.Replace("fontsstyle", _fonts.StyleString)
.Replace("tablesstyle", _tables.StyleString);
}
public void PrintHtmlCode() => Console.WriteLine(_html);
}
// 測試程式
class TestApp
{
public static void Main()
{
var factoryA = new StyleA();
var page1 = new HomePage(factoryA);
page1.PrintHtmlCode(); // 輸出 StyleA 版本
var factoryB = new StyleB();
var page2 = new HomePage(factoryB);
page2.PrintHtmlCode(); // 輸出 StyleB 版本
}
}
<html><body><table style='TablesStyleA'><tr><td><font style='FontsStyleA'>HelloWorld!</font></td></tr></table></body></html>
<html><body><table style='TablesStyleB'><tr><td><font style='FontsStyleB'>HelloWorld!</font></td></tr></table></body></html>