产品族与等级结构
Windows UI 产品族 TextBox CheckBox DropdownList Linux UI 产品族 TextBox CheckBox DropdownList
抽象工厂
- 一个具体工厂负责一种产品族整套产品的创建。所以具体工厂数量 = 产品族数量。这里需要两个具体工厂:WindowsUIFactory 和 LinuxUIFactory
- 既然每个具体工厂可以创建出一个产品族的整套产品,那么他就应该具有创建每种产品的方法,即创建方法数 = 产品种类(产品等级结构)数。而抽象工厂正是用来约束没个工厂应该具有什么创建方法的。那么抽象工厂UIFactory中应该有CreateTextBox(),CreateCheckbox(),CreateDropdownList()三个抽象方法。
- 每种产品(等级结构)都对应一个抽象产品来描述本产品的共性。有几种产品(等级结构)就需要有几个抽象产品。这里需要有:TextBox,CheckBox,DropdownList三个抽象产品。
- 到底要进哪个工厂是由客户来选择(不能强买强卖吧)。
using System; abstract class UIFactory { public abstract TextBox CreateTextBox(); public abstract Checkbox CreateCheckBox(); public abstract DropdownList CreateDropdownList(); } #region Window UI Factory class WindowsUIFactory : UIFactory { public override TextBox CreateTextBox() { return new WindowsTextBox(); } public override Checkbox CreateCheckBox() { return new WindowsCheckbox(); } public override DropdownList CreateDropdownList() { return new WindowsDropdownList(); } } #endregion #region Linux UI Factory class LinuxUIFactory : UIFactory { public override TextBox CreateTextBox() { return new LinuxTextBox(); } public override Checkbox CreateCheckBox() { return new LinuxCheckbox(); } public override DropdownList CreateDropdownList() { return new LinuxDropdownList(); } } #endregion abstract class TextBox { } abstract class Checkbox { } abstract class DropdownList { } #region Window UI Family class WindowsTextBox : TextBox { public override string ToString() { return "I am a Windows TextBox."; } } class WindowsCheckbox : Checkbox { public override string ToString() { return "I am a Windows Checkbox."; } } class WindowsDropdownList : DropdownList { public override string ToString() { return "I am a Windwos DropdownList."; } } #endregion #region Linux UI Family class LinuxTextBox : TextBox { public override string ToString() { return "I am a Linux TextBox."; } } class LinuxCheckbox : Checkbox { public override string ToString() { return "I am a Linux CheckBox."; } } class LinuxDropdownList : DropdownList { public override string ToString() { return "I am a Linux DropdownList."; } } #endregion public class App { public static void Main() { WindowsUIFactory winUIFactory = new WindowsUIFactory(); TextBox txt = winUIFactory.CreateTextBox(); Console.WriteLine(txt); LinuxUIFactory linUIFactory = new LinuxUIFactory(); DropdownList ddl = linUIFactory.CreateDropdownList(); Console.WriteLine(ddl); } }
工厂方法模式
工厂方法模式就好比是抽象工厂模式的缩水版。当只有一种产品(等级结构)时就退化为工厂方法模式。比如只有UI家族中只有TextBox。
工厂模式的优点及缺点
很好地支持产品族的增加,而对产品种类(等级结构)的增加支持不好。