設計模式之:抽象工廠模式AbstractFactoryPattern的實現
阿新 • • 發佈:2022-04-02
相比於工廠模式,抽象工廠模式的每個工廠可以建立產品系列,而不是一個產品;
抽象工廠用到的技術:介面、多型、配置檔案、反射;
抽象工廠模式的設計原則:
- 實現客戶端建立產品和使用產品的分離,客戶端無須瞭解建立的細節,符合迪米特法則;
- 客戶端面向介面定義產品,符合依賴倒置原則;
- 客戶端面向介面定義工廠,而實際根據配置檔案生成工廠實現類,符合里氏替換原則;
- 增加新的產品族時,無須修改原有程式碼,符合開閉原則;
- 使用配置檔案,而不是硬編碼方式指定建立的具體工廠,符合迪米特法則;
- 相較於簡單工廠模式,抽象工廠中,一個工廠只負責某一產品系列的建立,而不是所有產品的建立,符合單一職責原則;
類圖 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="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();
}
}
執行結果: