##一、定義 **提供一個創建一系列相關或互相依賴對象的介面,而無須指定他們具體的類,抽象工廠模式是一種創建型模式。** ##二、描述 **抽象工廠比工廠方法的抽象程度更高,通過引入了工廠等級結構,解決了簡單工廠模式中工廠類職責太重的原則。為了更好的理解抽象工廠模式,引入兩個概念:** **1、產品 ...
一、定義
提供一個創建一系列相關或互相依賴對象的介面,而無須指定他們具體的類,抽象工廠模式是一種創建型模式。
二、描述
抽象工廠比工廠方法的抽象程度更高,通過引入了工廠等級結構,解決了簡單工廠模式中工廠類職責太重的原則。為了更好的理解抽象工廠模式,引入兩個概念:
1、產品等級結構:指不同品牌的同一類型產品,如:小米電視機、海信電視機、索尼電視機
2、產品族:指同一品牌的不同了類型產品,如:小米電視機、小米手機、小米電腦
抽象工廠模式中的每個具體工廠提供了多個工廠方法用於產生多種不同類型的產品,這些產品構成了一個產品族,它包含以下四個角色:
1、AbstractFactory (抽象工廠):它聲明瞭一組用於創建一族產品的方法,每一個方法對應一種產品。
2、ConcreteFactory (具體工廠):它實現了在抽象工廠中聲明的創建產品的方法,生成一組具體產品,這些產品構成了一個產品族,每一個產品都位於某個產品等級結構中。
3、AbstractProduct (抽象產品角色):它為每種產品聲明介面,在抽象產品中聲明瞭產品所具有的業務方法。
4、ConcreteProduct (具體產品角色):它定義具體工廠生產的具體產品對象,實現在抽象產品介面中聲明的業務方法。
三、例子
X公司要開發一套皮膚庫,可切換不同風格,如春天風格,用淺綠色按鈕、文本框等,夏天用淺藍色的,後續還可以增加其他風格。
抽象產品介面:Button、TextField、ComboBox
public interface IButton
{
void Display();
}
public interface ITextField
{
void Display();
}
public interface IComboBox
{
void Display();
}
具體產品類:
SpringButton、SpringTextField、SpringComboBox,Spring風格按鈕、文本框、組合框
SummerButton、SummerTextField、SummerComboBox,Summer風格按鈕、文本框、組合框
public class SpringButton : IButton
{
public void Display()
{
Console.WriteLine("顯示淺綠色按鈕。");
}
}
public class SpringTextField : ITextField
{
public void Display()
{
Console.WriteLine("顯示綠色邊框文本框。");
}
}
public class SpringComboBox : IComboBox
{
public void Display()
{
Console.WriteLine("顯示綠色邊框下拉框。");
}
}
public class SummerButton : IButton
{
public void Display()
{
Console.WriteLine("顯示淺綠色按鈕。");
}
}
public class SummerTextField : ITextField
{
public void Display()
{
Console.WriteLine("顯示綠色邊框文本框。");
}
}
public class SummerComboBox : IComboBox
{
public void Display()
{
Console.WriteLine("顯示綠色邊框下拉框。");
}
}
抽象皮膚工廠介面:ISkinFactory
public interface ISkinFactory
{
IButton CreateButton();
ITextField CreateTextField();
IComboBox CreateComboBox();
}
具體皮膚工廠類:SpringSkinFactory、SummerSkinFactory
public class SpringSkinFactory : ISkinFactory
{
public IButton CreateButton()
{
return new SpringButton();
}
public IComboBox CreateComboBox()
{
return new SpringComboBox();
}
public ITextField CreateTextField()
{
return new SpringTextField();
}
}
public class SummerSkinFactory : ISkinFactory
{
public IButton CreateButton()
{
return new SummerButton();
}
public IComboBox CreateComboBox()
{
return new SummerComboBox();
}
public ITextField CreateTextField()
{
return new SummerTextField();
}
}
Program:測試代碼
Console.WriteLine("載入Spring皮膚\n");
ISkinFactory skinFactory = new SpringSkinFactory();
IButton button = skinFactory.CreateButton();
ITextField textField = skinFactory.CreateTextField();
IComboBox comboBox = skinFactory.CreateComboBox();
button.Display();
textField.Display();
comboBox.Display();
Console.ReadLine();
四、總結
如果需要增加新的產品族很方便,無需修改已有系統,符合開閉原則,但是如果需要增加產品等級結構,會非常麻煩,比如單選按鈕(RadioButton),因為抽象工廠ISkinFactory根本沒有提供創建的方法,需要依次修改抽象工廠介面、具體皮膚工廠類,抽象工廠模式無法很好的解決此類問題,這也是該模式最大的缺點,所以不適合在產品等級結構不穩定的場景下使用。
測試簽名