[设计模式]第三回:抽象工厂模式(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 不依赖具体的产品建立,而统一由工厂方法建立;
  • 切换产品方便,只须要切换工厂,接下来的由工厂建立的产品也就切换了;
  • 易扩展,如后续加产品,只需在工厂里建立出来就行,客户端不用改。

缺点:

  • 代码量大,因为抽象有工厂接口,有产品接口;
  • 修改量大,若有修改现有的产品,可能从接口修改到具体,全改一遍。
相关文章
相关标签/搜索