• [设计模式]第三回:抽象工厂模式(Abstract Factory)


    概述

    在系统中往往会有这种需求,客户端会用到很多对象,而且根据需求变化很可能会切换成另外一套对象。抽象工厂模式可以提供一种封装机制来面对这种需求。

    实践

     物理模型:

    皮肤主题:设计一个可以切换皮肤主题,切换为 黑色 和灰色样式,每个元素的样式都要单独定义,如Input的样式,button的样式,这些所有的元素样式组成一套皮肤主题。

    根据模型,先抽象,每种元素相当于一种产品,如button

        /// <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元素,其它元素的样式类似

        /// <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

    产品抽象完后,接下来抽象工厂

        /// <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();
            }
        }

    其它主题工厂类似

        /// <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 不依赖具体的产品创建,而统一由工厂方法创建;
    • 切换产品方便,只需要切换工厂,接下来的由工厂创建的产品也就切换了;
    • 易扩展,如后续加产品,只需在工厂里创建出来就行,客户端不用改。

    缺点:

    • 代码量大,由于抽象有工厂接口,有产品接口;
    • 修改量大,如有修改现有的产品,可能从接口修改到具体,全改一遍。
  • 相关阅读:
    文本设置超过几行显示...
    CSS内置的几个标准的伪类和伪对象
    正则替换URL地址为链接地址
    移动端某些机型touchend事件触发鸡肋
    zepto 扩展prevAll(),nextAll()方法
    火狐下window.event获取undefined问题
    哪些情况下margin-left和padding-left无效?
    兵部-2048
    HTML5 将成为 HTML、XHTML 以及 HTML DOM 的新标准。HTML 的上一个版本诞生于 1999 年。自从那以后,Web 世界已经经历了巨变。HTML5 仍处于完善之中。然而,大部分现代浏览器已经具备了某些 HTML5 支持。
    二分查找
  • 原文地址:https://www.cnblogs.com/qqlin/p/4137230.html
Copyright © 2020-2023  润新知