相比于工廠模式,抽象工廠模式的每個工廠可以創建產品系列,而不是一個產品;
抽象工廠用到的技術:介面、多型、組態檔、反射;
抽象工廠模式的設計原則:
- 實作客戶端創建產品和使用產品的分離,客戶端無須了解創建的細節,符合迪米特法則;
- 客戶端面向介面定義產品,符合依賴倒置原則;
- 客戶端面向介面定義工廠,而實際根據組態檔生成工廠實作類,符合里氏替換原則;
- 增加新的產品族時,無須修改原有代碼,符合開閉原則;
- 使用組態檔,而不是硬編碼方式指定創建的具體工廠,符合迪米特法則;
- 相較于簡單工廠模式,抽象工廠中,一個工廠只負責某一產品系列的創建,而不是所有產品的創建,符合單一職責原則;
類圖 with SartUML

工廠介面和兩個實作類
internal interface SkinFactory
{
Button CreateButton();
TextField CreateTextField();
ComboBox CreateComboBox();
}
internal class SpringSkinFactory : SkinFactory
{
public Button CreateButton()
{
return new SpringButton();
}
public ComboBox CreateComboBox()
{
return new SpringComboBox();
}
public TextField CreateTextField()
{
return new SpringTextField();
}
}
internal class SummerSkinFactory : SkinFactory
{
public Button CreateButton()
{
return new SummerButton();
}
public ComboBox CreateComboBox()
{
return new SummerComboBox();
}
public TextField CreateTextField()
{
return new SummerTextField();
}
}
Button產品介面和兩個實作類
internal interface Button
{
void Display();
}
internal class SpringButton : Button
{
public void Display()
{
Console.WriteLine("綠色按鈕");
}
}
internal class SummerButton : Button
{
public void Display()
{
Console.WriteLine("藍色按鈕");
}
}
TextField產品的介面和兩個實作類
internal interface TextField
{
void Display();
}
internal class SpringTextField : TextField
{
public void Display()
{
Console.WriteLine("綠色文本框");
}
}
internal class SummerTextField : TextField
{
public void Display()
{
Console.WriteLine("藍色文本框");
}
}
ComboBox產品的介面和兩個實作類
internal interface ComboBox
{
void Display();
}
internal class SpringComboBox : ComboBox
{
public void Display()
{
Console.WriteLine("綠色組合框");
}
}
internal class SummerComboBox : ComboBox
{
public void Display()
{
Console.WriteLine("藍色組合框");
}
}
組態檔
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="factoryType" value="https://www.cnblogs.com/zhangdezhang/p/AbstractFactoryPattern.SpringSkinFactory"/>
</appSettings>
</configuration>
客戶端
internal class Program
{
static void Main(string[] args)
{
//面向介面定義,使用多型,便于擴展
SkinFactory factory;
Button button;
TextField textField;
ComboBox comboBox;
//讀取組態檔
string factoryType = ConfigurationManager.AppSettings["factoryType"];
//反射創建工廠物件
factory = Assembly.Load("AbstractFactoryPattern").CreateInstance(factoryType)as SkinFactory;
//工廠創建UI物件
button = factory.CreateButton();
textField = factory.CreateTextField();
comboBox = factory.CreateComboBox();
button.Display();
textField.Display();
comboBox.Display();
Console.Read();
}
}
運行結果:

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/455442.html
標籤:設計模式
