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

    上一篇介绍了工厂模式,接下来介绍抽象工厂。

    抽象工厂类图来自百度:

    这个图看着有点晕,我们换张,来自博客园的:

     工厂方法中,一个工厂只负责实例化一个类,而抽象工厂里一个工厂可以实现化两个(或多个类) 而这两个类是可以分别继承自不同的类的这是关键

    工厂方法模式针对的是一个产品等级结构,就是子类全继承自一个类;而抽象工厂模式针对的是多个产品等级结构,就是继承自多个父类。

    在每一个产品等级结构中(继承自同一个类),功能相关联的产品(由同一个工厂创建)组成的家族,就叫产品簇

    总的来说就是不同的具体工厂生产不同的产品族,

    现在我们再来看第一个图:

    1. 具体工厂ConcreteCreator1有两个创建方法,分别用于创建ProductA1和ProductB1.

    2. 这个ProductA1和ProductB1,构成一个产品族1,ProductA2和ProductB2构成产品族2.

    3. 一个具体工厂负责创建一个产品族。

    4. 从上得知,a) 这个模式中有多少个产品基类,工厂中,就会有多少个创建方法。b) 有几个产品族,就有几个具体的工厂

    举例例子:Mac系列有三款产品:Mac Pro ,Mac Air, Mac Mini

                      iPad也有三款产品: iPad Pro,  iPad Air ,iPad Mini

    我们分析一下,就会得出如下的设计:
    1. 这里有两个产品等级结构(产品基类):Mac和iPad
    2. 抽象工厂中就会有两个抽象的创建方法:createMac() 和 createIPad(),
    3. 有三个产品族:Pro,Air,Mini。
    4. 也就会有三个具体的工厂:ProFactory, AirFactory, MiniFactory
    5. 抽象工厂中就会有两个抽象的创建方法:createMac() 和 createIPad(),
    下面我们来看代码:
     public abstract class Mac
        {
            public abstract void Show();
        }
    
        public class MacPro : Mac
        {
            public override void Show()
            {
                Console.WriteLine("我是 Mac Pro");
            }
        }
    
        public class MacAir : Mac
        {
            public override void Show()
            {
                Console.WriteLine("我是 Mac Air");
            }
        }
    
        public class MacMini : Mac
        {
            public override void Show()
            {
                Console.WriteLine("我是 Mac Mini");
            }
        }
    
        public abstract class IPad
        {
            public abstract void Show();
        }
    
        public class IPadPro : IPad
        {
            public override void Show()
            {
                Console.WriteLine("我是 IPad Pro");
            }
        }
    
        public class IPadAir : IPad
        {
            public override void Show()
            {
                Console.WriteLine("我是 IPad Air");
            }
        }
    
        public class IPadMini : IPad
        {
            public override void Show()
            {
                Console.WriteLine("我是 IPad Mini");
            }
        }
    
        public abstract class AbstractFactory
        {
            public abstract Mac CreateMac();
            public abstract IPad CreateIPad();
        }
    
        /// <summary>
        /// Pro产品族工厂
        /// </summary>
        public class ProFactory : AbstractFactory
        {
            public override IPad CreateIPad()
            {
                return new IPadPro();
            }
    
            public override Mac CreateMac()
            {
                return new MacPro();
            }
        }
    
        /// <summary>
        /// Air产品族工厂
        /// </summary>
        public class AirFactory : AbstractFactory
        {
            public override IPad CreateIPad()
            {
                return new IPadAir();
            }
    
            public override Mac CreateMac()
            {
                return new MacAir();
            }
        }
    
        /// <summary>
        /// Mini产品族工厂
        /// </summary>
        public class MiniFactory : AbstractFactory
        {
            public override IPad CreateIPad()
            {
                return new IPadMini();
            }
    
            public override Mac CreateMac()
            {
                return new MacMini();
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                Console.OutputEncoding = Encoding.UTF8;
    
                AbstractFactory profactory = new ProFactory();
                AbstractFactory airfactory = new AirFactory();
                AbstractFactory minifactory = new MiniFactory();
    
                Mac macPro = profactory.CreateMac();
                Mac macAir = airfactory.CreateMac();
                Mac macMini = minifactory.CreateMac();
                macPro.Show();
                macAir.Show();
                macMini.Show();
    
                IPad iPadPro = profactory.CreateIPad();
                IPad iPadAir = airfactory.CreateIPad();
                IPad iPadMini = minifactory.CreateIPad();
                iPadPro.Show();
                iPadAir.Show();
                iPadMini.Show();
    
    
                Console.ReadKey();
            }
        }

    回过头来,我们再来看工厂方法模块与抽象工厂方法模式的区别,就在于,一个工厂由过去只实例化一个产品,到现在实例化两个产品而已。具体工厂的数量仍然与产品子类的个数相关。

  • 相关阅读:
    TCP 协议三次握手过程解析带实例
    一些关于反汇编与逆向方面的博文分享
    关于mwArray和一般数组的区别
    vc6.0 使用Ado 连接MS-SqlServer2000 连接字符串
    VC6使用技巧
    Oracle性能诊断艺术-读书笔记(执行计划中显示 Starts, E-Rows, REM A-Rows and A-Time)等)
    Oracle性能诊断艺术-读书笔记
    linux 检查补丁包是否安装 名称 版本 release号
    我叫他小北
    Oracle linux安装Oracle 11G
  • 原文地址:https://www.cnblogs.com/hankuikui/p/7066218.html
Copyright © 2011-2022 走看看