zoukankan      html  css  js  c++  java
  • 抽象工厂模式

    抽象工厂模式:提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。

    为了更好的理解抽象工厂模式的,先引入两个概念。

    概念一,产品等级结构:这个结构就是产品的继承接口,比如电视机,里面有TCL电视机,海信等电视机。那我们就可以理解为电视机和具体品牌的电视机就会形成一个产品等级结构,电视机是抽象的,具体的产品则是子类。

    概念二,产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的产品。比如我TCL的工厂里面生产电视机,手机,TCL电视机在电视机的产品等级结构中,而TCL手机位于手机的产品等级结构中。但是TCL电视机、手机则称之为一个产品族。

    抽象工厂模式的结构

    抽象工厂:声明一组用于创建一族产品的方法,每一个方法对应一种产品。

    具体工厂:实现抽象工厂的方法,生成一组具体的产品,这些产品构成一个产品族,每一个产品都位于某个产品等级结构中。

    抽象产品:给每种产品声明抽象接口,声明产品的方法。

    具体产品:实现抽象产品的方法。

    下面用具体的代码来实现抽象工厂模式

    现在博客园要出两种皮肤,一种春天,一种夏天两种风格。每种风格的按钮、文本框、多选框都不一样,现在用抽象工厂模式实现它。

    先声明抽象产品,按钮和多选框(一个产品族)

        /// <summary>
        /// 按钮
        /// </summary>
      public  interface IButton
        {
            /// <summary>
            /// 业务方法
            /// </summary>
            void  Display();
        }
        /// <summary>
        /// 多选框
        /// </summary>
        public interface ICheckBox
        {
            /// <summary>
            /// 业务方法
            /// </summary>
            void Display();
        }

    具体的产品有两种风格,春天(Spring)和夏天(Summer)

        /// <summary>
        /// 春天皮肤
        /// </summary>
        public class SpringButton : IButton
        {
            public void Display()
            {
                Console.WriteLine("显示春天皮肤按钮");
            }
        }
    
        public class SpringCheckBox : ICheckBox
        {
            public void Display()
            {
                Console.WriteLine("显示春天皮肤多选框");
            }
        }
        /// <summary>
        /// 夏天皮肤
        /// </summary>
        public class SummerButton : IButton
        {
            public void Display()
            {
                Console.WriteLine("显示夏天皮肤按钮");
            }
        }
    
        public class SummerCheckBox : ICheckBox
        {
            public void Display()
            {
                Console.WriteLine("显示夏天皮肤多选框");
            }
        }

    产品创建好,把抽象工厂也安排上,抽象工厂都是我们要创建产品的方法。

        /// <summary>
        /// 抽象工厂--皮肤
        /// </summary>
        public interface ISkinFactory
        {
            /// <summary>
            /// 创建按钮
            /// </summary>
            /// <returns></returns>
            IButton CreateButton();
            /// <summary>
            /// 创建多选框
            /// </summary>
            /// <returns></returns>
            ICheckBox CreateCheckBox();
        }

    实现抽象工厂,创建不同的产品族

    public class SpringFactory : ISkinFactory
        {
            public IButton CreateButton()
            {
                Console.WriteLine("创建春天风格按钮");
                return new SpringButton();
            }
    
            public ICheckBox CreateCheckBox()
            {
                Console.WriteLine("创建春天风格复选框");
                return new SpringCheckBox();
            }
        }
    
        public class SummerFactory : ISkinFactory
        {
            public IButton CreateButton()
            {
                Console.WriteLine("创建夏天风格按钮");
                return new SummerButton();
            }
    
            public ICheckBox CreateCheckBox()
            {
                Console.WriteLine("创建夏天风格复选框");
                return new SummerCheckBox();
            }
        }

    抽象工厂模式的结构实现了,跑代码测试一下。

    夏天快到了,来一个夏天风格的皮肤

                    ISkinFactory factory = new SummerFactory();//实例化工厂
                    IButton button = factory.CreateButton();//创建对应产品
                    ICheckBox checkBox = factory.CreateCheckBox();
                    button.Display();//调用方法
                    checkBox.Display();

    测试结果。

     如果要增加一个输入框的话,新增抽象输入框和具体输入框,在抽象工厂中加入对应的方法,并在不同的产品族中实现。

    抽象工厂模式和工厂模式的比较

    工厂模式每个工厂只能对单个产品实现生产。

    抽象工厂模式每个工厂能对多个不同的产品实现生产,只要是一个产品族的都能实现生产。

    对比二者,其实能够让我们作出对二者使用的选择的,当业务的要求值针对多种不同单个产品,我想用工厂模式可能更好,如果我需要对多个系列不同的产品做业务处理,那么我抽象工厂模式可能更好,如果用反,会导致系统理解更加复杂,类更加多,维护难度加大,这也违背设计模式最初的原则。

    欢迎加入.net学习交流群:925362372

  • 相关阅读:
    WITH HINDSIGHT
    圆桌最后冲刺
    圆桌总结
    圆桌十日冲刺之⑨
    圆桌十日冲刺之八
    圆桌十日冲刺之七
    圆桌十日冲刺之六
    【09NOIP提高组】Hankson 的趣味题(信息学奥赛一本通 1856)(洛谷 1072)
    灯泡(信息学奥赛一本通 1438)
    最大公约数(信息学奥赛一本通 1627)
  • 原文地址:https://www.cnblogs.com/aqgy12138/p/12839693.html
Copyright © 2011-2022 走看看