在系統中每每會有這種需求,客戶端會用到不少對象,並且根據需求變化極可能會切換成另一套對象。抽象工廠模式能夠提供一種封裝機制來面對這種需求。html
物理模型:數據庫
皮膚主題:設計一個能夠切換皮膚主題,切換爲 黑色 和灰色樣式,每一個元素的樣式都要單獨定義,如Input的樣式,button的樣式,這些全部的元素樣式組成一套皮膚主題。ide
根據模型,先抽象,每種元素至關於一種產品,如buttonspa
/// <summary> /// Button按鈕樣式 /// </summary> public interface IButton { int Border { get; } string BackColor { get; } }
而後 具體實現它設計
/// <summary> /// 灰色按鈕樣式 /// </summary> public class GrayButton : IButton { public GrayButton() { Border = 1; BackColor = "#ccc"; } public int Border { get; set; } public string BackColor { get; set; } } /// <summary> /// 黑色按鈕樣式 /// </summary> public class BlackButton : IButton { public BlackButton() { Border = 1; BackColor = "#fff"; } public int Border { get; set; } public string BackColor { get; set; } }
上面是一種html元素,其它元素的樣式相似code
/// <summary> /// 文本框 /// </summary> public interface IInput { int Border { get; } } /// <summary> /// 灰色文本框樣式 /// </summary> public class GrayInput : IInput { public GrayInput() { Border = 1; } public int Border { get; set; } } /// <summary> /// 黑色文本框樣式 /// </summary> public class BlackInput : IInput { public BlackInput() { Border = 1; } public int Border { get; set; } }
產品抽象完後,接下來抽象工廠htm
/// <summary> /// 抽象工廠 /// </summary> public interface IThemesFactory { IButton CreateButton(); IInput CreateInput(); }
具體主題樣式工廠對象
/// <summary> /// 建立灰色樣式工廠 /// </summary> public class GrayFactory : IThemesFactory { public IButton CreateButton() { return new GrayButton(); } public IInput CreateInput() { return new GrayInput(); } }
其它主題工廠相似blog
/// <summary> /// 黑色主題樣式工廠 /// </summary> public class BlackFactory : IThemesFactory { public IButton CreateButton() { return new BlackButton(); } public IInput CreateInput() { return new BlackInput(); } }
客戶端調用接口
/// <summary> /// 主題 /// </summary> public class ThemesMain { public void Main() { //灰色主題工廠 IThemesFactory factory = new GrayFactory(); //按鈕樣式 IButton button = factory.CreateButton(); //文本框樣式 IInput input = factory.CreateInput(); } }
抽象工廠適用於一系列的對象的建立和切換,如 數據庫配置有 MsSql,MySql,每種數據庫下的 查詢User 都是不同,能夠抽象工廠,寫兩套,客戶端方便切換。
抽象工廠優勢:
缺點: