[設計模式]第三回:抽象工廠模式(Abstract Factory)

概述

在系統中每每會有這種需求,客戶端會用到不少對象,並且根據需求變化極可能會切換成另一套對象。抽象工廠模式能夠提供一種封裝機制來面對這種需求。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; }
    }
View Code

產品抽象完後,接下來抽象工廠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();
        }
    }
View Code

客戶端調用接口

    /// <summary>
    /// 主題
    /// </summary>
    public class ThemesMain
    {
        public void Main()
        {
            //灰色主題工廠
            IThemesFactory factory = new GrayFactory();
            //按鈕樣式
            IButton button = factory.CreateButton();
            //文本框樣式
            IInput input = factory.CreateInput();
        }
    }

 

小結

抽象工廠適用於一系列的對象的建立和切換,如 數據庫配置有 MsSql,MySql,每種數據庫下的 查詢User 都是不同,能夠抽象工廠,寫兩套,客戶端方便切換。

抽象工廠優勢:

  • 客戶端Main 裏 都是使用抽象產品如IButton 不依賴具體的產品建立,而統一由工廠方法建立;
  • 切換產品方便,只須要切換工廠,接下來的由工廠建立的產品也就切換了;
  • 易擴展,如後續加產品,只需在工廠裏建立出來就行,客戶端不用改。

缺點:

  • 代碼量大,因爲抽象有工廠接口,有產品接口;
  • 修改量大,若有修改現有的產品,可能從接口修改到具體,全改一遍。
相關文章
相關標籤/搜索