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

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

  • 相关阅读:
    迭代器和生成器
    案例:复制大文件
    案例:使用seek倒查获取日志文件的最后一行
    Leetcode165. Compare Version Numbers比较版本号
    Leetcode137. Single Number II只出现一次的数字2
    Leetcode129. Sum Root to Leaf Numbers求根到叶子节点数字之和
    Leetcode116. Populating Next Right Pointers in Each Node填充同一层的兄弟节点
    Leetcode114. Flatten Binary Tree to Linked List二叉树展开为链表
    Leetcode113. Path Sum II路径总和2
    C++stl中vector的几种常用构造方法
  • 原文地址:https://www.cnblogs.com/hankuikui/p/7066218.html
Copyright © 2011-2022 走看看