VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • C#设计模式学习笔记:(3)抽象工厂模式

 本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7596897.html,记录一下学习过程以备后续查用。

    一、引言

    接上一篇C#设计模式学习笔记:简单工厂模式(工厂方法模式前奏篇),通过简单工厂模式的了解,它的缺点就是随着需求的变化我们要不停地修改工厂里

    上一篇文章我们讲了工厂方法模式,它是为了解决简单工厂模式所面对的问题:如果我们增加新的产品,工厂类的方法就要修改本身的代码,增加产品越

多,其逻辑越复杂,同时这样的修改也不符合开放闭合原则OCP--对增加代码开放,对修改代码关闭。为了解决简单工厂的问题,我们引出了工厂方法模式,

通过子类化工厂类,解决了工厂类责任的划分,使得产品和相应的工厂一一对应,符合了OCP。

    如果我们要设计一套房子,当然我们知道房子是由房顶、地板、窗户、房门等组成的,先设计一套古典风格的房子,再创建一套现代风格的房子,再创建

一套欧式风格的房子,这么多套房子,我们该怎么办呢?今天我们要讲的抽象工厂模式可以很好地解决多套变化的问题。

    二、抽象工厂模式介绍

    抽象工厂模式:英文名称--Abstract Factory Pattern;分类--创建型。

    2.1、动机(Motivate)

    在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作,同时,由于需求的变化,往往存在更多系列对象的创建工作。如何应对这种变化?如何

绕过常规的对象创建方法(new),提供一种"封装机制"来避免客户程序和这种"多系列具体对象创建工作"的紧耦合?

    2.2、意图(Intent)

    提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。——《设计模式》GoF

    2.3、结构图(Structure)

    该图是抽象工厂的UML图,结合抽象工厂的意图、动机和图示来理解该模式,今天我们就以建设房子为例来说明抽象工厂的实现机理。

    2.4、模式的组成

    从上图可以看出,在抽象工厂模式的结构图有以下角色:

    1)抽象产品类角色(AbstractProduct):为抽象工厂中相互依赖的每种产品定义抽象接口对象,也可以这样说,有几种产品,就要声明几个抽象角色,

每一个抽象产品角色和一种具体的产品相匹配。

    2)具体产品类(ConcreteProduct):具体产品类实现了抽象产品类,是针对某个具体产品的实现的类型。

    3)抽象工厂类角色(AbstractFactory):定义了创建一组相互依赖的产品对象的接口操作,每种操作和每种产品一一对应。

    4)具体工厂类角色(ConcreteFactory):实现抽象类里所有抽象接口操作,可以创建某系列具体的产品,这些具体的产品是“抽象产品类角色”的子类。

    2.5、抽象工厂模式的具体实现

    随着我们年龄的增长,我们也到了结婚的年龄,结婚首要的问题就是房子的问题。假设我有一个很有钱的爸爸(呃,发梦中……),我的哥哥们希望能有

一套欧式风格的房子,再加上田园风光,悠闲自在。而我就不一样了,我希望有一套现代样式的房子。由于房子由房顶、地板、窗户和房门组成(其他组

件暂时省略),每套房子的房顶、地板、窗户和房门都是一个体系的。

    下面让我们看看如何使用抽象工厂模式来实现不同房屋的建造:

复制代码
    class Program
    {
        /// <summary>
        /// 房顶抽象类,子类的房顶必须继承该类。
        /// </summary>
        public abstract class Roof
        {
            /// <summary>
            /// 创建房顶
            /// </summary>
            public abstract void Create();
        }

        /// <summary>
        /// 地板抽象类,子类的地板必须继承该类。
        /// </summary>
        public abstract class Floor
        {
            /// <summary>
            /// 创建地板
            /// </summary>
            public abstract void Create();
        }

        /// <summary>
        /// 窗户抽象类,子类的窗户必须继承该类。
        /// </summary>
        public abstract class Window
        {
            /// <summary>
            /// 创建窗户
            /// </summary>
            public abstract void Create();
        }

        /// <summary>
        /// 房门抽象类,子类的房门必须继承该类。
        /// </summary>
        public abstract class Door
        {
            /// <summary>
            /// 创建房门
            /// </summary>
            public abstract void Create();
        }

        /// <summary>
        /// 欧式的房顶
        /// </summary>
        public class EuropeanRoof : Roof
        {
            public override void Create()
            {
                Console.WriteLine("创建欧式的房顶");
            }
        }

        /// <summary>
        /// 欧式的地板
        /// </summary>
        public class EuropeanFloor : Floor
        {
            public override void Create()
            {
                Console.WriteLine("创建欧式的地板");
            }
        }

        /// <summary>
        ///欧式的窗户
        /// </summary>
        public class EuropeanWindow : Window
        {
            public override void Create()
            {
                Console.WriteLine("创建欧式的窗户");
            }
        }

        /// <summary>
        /// 欧式的房门
        /// </summary>
        public class EuropeanDoor : Door
        {
            public override void Create()
            {
                Console.WriteLine("创建欧式的房门");
            }
        }

        /// <summary>
        /// 现代的房顶
        /// </summary>
        public class ModernizationRoof : Roof
        {
            public override void Create()
            {
                Console.WriteLine("创建现代的房顶");
            }
        }

        /// <summary>
        /// 现代的地板
        /// </summary>
        public class ModernizationFloor : Floor
        {
            public override void Create()
            {
                Console.WriteLine("创建现代的地板");
            }
        }

        /// <summary>
        /// 现代的窗户
        /// </summary>
        public class ModernizationWindow : Window
        {
            public override void Create()
            {
                Console.WriteLine("创建现代的窗户");
            }
        }

        /// <summary>
        /// 现代的房门
        /// </summary>
        public class ModernizationDoor : Door
        {
            public override void Create()
            {
                Console.WriteLine("创建现代的房门");
            }
        }

        /// <summary>
        /// 抽象工厂类,提供创建不同类型房子的接口。
        /// </summary>
        public abstract class AbstractFactory
        {
            //抽象工厂提供创建一系列产品的接口,此处给出了房顶、地板、窗户和房门的创建接口。
            public abstract Roof CreateRoof();
            public abstract Floor CreateFloor();
            public abstract Window CreateWindow();
            public abstract Door CreateDoor();
        }

        /// <summary>
        /// 欧式风格房子的工厂,负责创建欧式风格的房子。
        /// </summary>
        public class EuropeanFactory : AbstractFactory
        {
            //制作欧式房顶
            public override Roof CreateRoof()
            {
                return new EuropeanRoof();
            }

            //制作欧式地板
            public override Floor CreateFloor()
            {
                return new EuropeanFloor();
            }

            //制作欧式窗户
            public override Window CreateWindow()
            {
                return new EuropeanWindow();
            }

            //制作欧式房门
            public override Door CreateDoor()
            {
                return new EuropeanDoor();
            }
        }

        /// <summary>
        /// 现在风格房子的工厂,负责创建现代风格的房子。
        /// </summary>
        public class ModernizationFactory : AbstractFactory
        {
            //制作现代房顶
            public override Roof CreateRoof()
            {
                return new ModernizationRoof();
            }

            //制作现代地板
            public override Floor CreateFloor()
            {
                return new ModernizationFloor();
            }

            //制作现代窗户
            public override Window CreateWindow()
            {
                return new ModernizationWindow();
            }

            //制作现代房门
            public override Door CreateDoor()
            {
                return new ModernizationDoor();
            }
        }

        static void Main(string[] args)
        {
            #region 抽象工厂模式
            //欧式风格的房子
            AbstractFactory europeanFactory = new EuropeanFactory();
            europeanFactory.CreateRoof().Create();
            europeanFactory.CreateFloor().Create();
            europeanFactory.CreateWindow().Create();
            europeanFactory.CreateDoor().Create();

            //现代风格的房子
            AbstractFactory modernizationFactory = new ModernizationFactory();
            modernizationFactory.CreateRoof().Create();
            modernizationFactory.CreateFloor().Create();
            modernizationFactory.CreateWindow().Create();
            modernizationFactory.CreateDoor().Create();

            Console.Read();
            #endregion
        }
    }
复制代码

    运行结果如下:

    2.6、 抽象工厂模式应对需求变更

    假设我的姐姐一看我们的房子很好,她希望有一套古典风格的房子,怎么处理呢?

复制代码
    class Program
    {
        /// <summary>
        /// 房顶抽象类,子类的房顶必须继承该类。
        /// </summary>
        public abstract class Roof
        {
            /// <summary>
            /// 创建房顶
            /// </summary>
            public abstract void Create();
        }

        /// <summary>
        /// 地板抽象类,子类的地板必须继承该类。
        /// </summary>
        public abstract class Floor
        {
            /// <summary>
            /// 创建地板
            /// </summary>
            public abstract void Create();
        }

        /// <summary>
        /// 窗户抽象类,子类的窗户必须继承该类。
        /// </summary>
        public abstract class Window
        {
            /// <summary>
            /// 创建窗户
            /// </summary>
            public abstract void Create();
        }

        /// <summary>
        /// 房门抽象类,子类的房门必须继承该类。
        /// </summary>
        public abstract class Door
        {
            /// <summary>
            /// 创建房门
            /// </summary>
            public abstract void Create();
        }

        /// <summary>
        /// 欧式的房顶
        /// </summary>
        public class EuropeanRoof : Roof
        {
            public override void Create()
            {
                Console.WriteLine("创建欧式的房顶");
            }
        }

        /// <summary>
        /// 欧式的地板
        /// </summary>
        public class EuropeanFloor : Floor
        {
            public override void Create()
            {
                Console.WriteLine("创建欧式的地板");
            }
        }

        /// <summary>
        ///欧式的窗户
        /// </summary>
        public class EuropeanWindow : Window
        {
            public override void Create()
            {
                Console.WriteLine("创建欧式的窗户");
            }
        }

        /// <summary>
        /// 欧式的房门
        /// </summary>
        public class EuropeanDoor : Door
        {
            public override void Create()
            {
                Console.WriteLine("创建欧式的房门");
            }
        }

        /// <summary>
        /// 现代的房顶
        /// </summary>
        public class ModernizationRoof : Roof
        {
            public override void Create()
            {
                Console.WriteLine("创建现代的房顶");
            }
        }

        /// <summary>
        /// 现代的地板
        /// </summary>
        public class ModernizationFloor : Floor
        {
            public override void Create()
            {
                Console.WriteLine("创建现代的地板");
            }
        }

        /// <summary>
        /// 现代的窗户
        /// </summary>
        public class ModernizationWindow : Window
        {
            public override void Create()
            {
                Console.WriteLine("创建现代的窗户");
            }
        }

        /// <summary>
        /// 现代的房门
        /// </summary>
        public class ModernizationDoor : Door
        {
            public override void Create()
            {
                Console.WriteLine("创建现代的房门");
            }
        }

        /// <summary>
        ///古典的房顶
        /// </summary>
        public class ClassicalRoof : Roof
        {
            public override void Create()
            {
                Console.WriteLine("创建古典的房顶");
            }
        }

        /// <summary>
        /// 古典的地板
        /// </summary>
        public class ClassicalFloor : Floor
        {
            public override void Create()
            {
                Console.WriteLine("创建古典的地板");
            }
        }

        /// <summary>
        /// 古典的窗户
        /// </summary>
        public class ClassicalWindow : Window
        {
            public override void Create()
            {
                Console.WriteLine("创建古典的窗户");
            }
        }

        /// <summary>
        /// 古典的房门
        /// </summary>
        public class ClassicalDoor : Door
        {
            public override void Create()
            {
                Console.WriteLine("创建古典的房门");
            }
        }

        /// <summary>
        /// 抽象工厂类,提供创建不同类型房子的接口。
        /// </summary>
        public abstract class AbstractFactory
        {
            //抽象工厂提供创建一系列产品的接口,此处给出了房顶、地板、窗户和房门的创建接口。
            public abstract Roof CreateRoof();
            public abstract Floor CreateFloor();
            public abstract Window CreateWindow();
            public abstract Door CreateDoor();
        }

        /// <summary>
        /// 欧式风格房子的工厂,负责创建欧式风格的房子。
        /// </summary>
        public class EuropeanFactory : AbstractFactory
        {
            //制作欧式房顶
            public override Roof CreateRoof()
            {
                return new EuropeanRoof();
            }

            //制作欧式地板
            public override Floor CreateFloor()
            {
                return new EuropeanFloor();
            }

            //制作欧式窗户
            public override Window CreateWindow()
            {
                return new EuropeanWindow();
            }

            //制作欧式房门
            public override Door CreateDoor()
            {
                return new EuropeanDoor();
            }
        }

        /// <summary>
        /// 现在风格房子的工厂,负责创建现代风格的房子。
        /// </summary>
        public class ModernizationFactory : AbstractFactory
        {
            //制作现代房顶
            public override Roof CreateRoof()
            {
                return new ModernizationRoof();
            }

            //制作现代地板
            public override Floor CreateFloor()
            {
                return new ModernizationFloor();
            }

            //制作现代窗户
            public override Window CreateWindow()
            {
                return new ModernizationWindow();
            }

            //制作现代房门
            public override Door CreateDoor()
            {
                return new ModernizationDoor();
            }
        }

        /// <summary>
        /// 古典风格房子的工厂,负责创建古典风格的房子。
        /// </summary>
        public class ClassicalFactory : AbstractFactory
        {
            //创建古典房顶
            public override Roof CreateRoof()
            {
                return new ClassicalRoof();
            }

            //创建古典地板
            public override Floor CreateFloor()
            {
                return new ClassicalFloor();
            }

            //创建古典窗户
            public override Window CreateWindow()
            {
                return new ClassicalWindow();
            }

            //创建古典房门
            public override Door CreateDoor()
            {
                return new ClassicalDoor();
            }
        }

        static void Main(string[] args)
        {
            #region 抽象工厂模式
            //欧式风格的房子