Abstract Factory,把英文直接翻译过来的话就是“抽象工厂”,既然是工厂,那就肯定是生产产品的地方。不过,它不是生产同一类的产品,而是生产同一系列的产品。举个例子,广州本田现在生产3种汽车,Odyssey、Accord、Fit,而广本的工厂里面并不是拥有3条不同的生产线以生产不同的汽车。这就非常相似于我们正在讨论的抽象工厂模式,广本在生产不同的汽车时,需要在各个生产环节进行修改,换机器自然是不合适的,因为这3种汽车每天都要生产,分时段而已。如果某一个环节的更换工作出了问题都会有大麻烦,比如Fit的车顶肯定装不到Odyssey上。我们在软件设计的时候也是这样,如果需要某一系列配套的类来进行工作,当这个系列中有一个类用错了,后果都是不好的。再回到广本的例子上,当广本准备生产另外一种汽车时,只需要拥有相应的配套模具(还有其他的一些配件和一些数控设备的控制程序)就可以了,没有必要搞一大堆的生产线。

再来一个生活中的例子,西服+西裤+皮鞋+白衬衫+领带+头发梳得顺顺的,出入高级会所或者重要场合的时候,男人一般都这样穿;休闲装+运动鞋+随意的发型,生活中就这样穿,舒服;睡衣+拖鞋+鸡窝头,早上就这样。每一种都是合适的造型,如果你搞成如下这样的造型就不合适了,西服+西裤+回力鞋+超级大背包+鸡窝头,广州火车站很多同志都是这样打扮的。

抽象工厂模式是一种创建型的模式。上面的比喻说明了抽象工厂就是生产同一个系列产品的东西,因为这一系列的产品是关联的,如果混用就可能出问题,所以就统一的在抽象工厂中进行创建。当要增加一个新的产品系列时,就多写一个工厂子类并添加相应的产品子类就可以了。

我们来看一个类图。

图中,我们可以看到,客户需要得到某系列的产品的时候,直接用相应的工厂子类来创建产品就可以了。比如,当需要生产Fit时,就用FitFactory,等到换班之后,要生产Odyssey了,直接使用OdysseyFactory替换FitFactory就行了,至于怎么替换就随便了,GoF也给了我们一些建议,我将在后面总结创建型模式的时候讲。

把上面的类图转换成代码,应该是这个样子。

关于车门的类:

    public abstract class AbstractDoor
    {
    }

    public class FitDoor : AbstractDoor
    {
    }

    public class OdysseyDoor : AbstractDoor
    {
    }

关于底盘的类:

    public abstract class AbstractChassis
    {
    }

    public class FitChassis : AbstractChassis
    {
    }

    public class OdysseyChassis : AbstractChassis
    {
    }

关于工厂的类:

    public abstract class HondaFactory
    {
        public abstract AbstractDoor CreateDoor();
        public abstract AbstractChassis CreateChassis();
    }

    public class FitFactory
    {
        public AbstractDoor CreateDoor()
        {
            return new FitDoor();
        }
        public AbstractChassis CreateChassis()
        {
            return new FitChassis();
        }
    }

    public class OdysseyFactory
    {
        public AbstractDoor CreateDoor()
        {
            return new OdysseyDoor();
        }
        public AbstractChassis CreateChassis()
        {
            return new OdysseyChassis();
        }
    }

客户的调用:

    public class Client
    {
        private AbstractDoor _door;
        private AbstractChassis _chassis;
        private HondaFactory _factory;

        public void GetACar(string seriesName)
        {
            this.PrepareFactory(seriesName);
            this._door = this._factory.CreateDoor();
            this._chassis = this._factory.CreateChassis();

            // TODO: Make a car!
        }

        private void PrepareFactory(string seriesName)
        {
            switch(seriesName)
            {
                case "Fit":
                    this._factory = new FitFactory();
                    break;
                case "Odyssey":
                    this._factory = new OdysseyFactory();
                    break;
            }
        }
    }

抽象工厂的优点很明显了,就是在需要用到一系列相关类的地方,它可以使我们不出错的创建出一系列的类实例,而我们在需要添加新的产品系列的时候,完全不需要考虑其他系列的问题,仅需要将相关的抽象类(工厂已经产品)具体化就可以了。缺点也在这个地方,当工厂需要生产多一种产品(不是系列)的时候,改动将波及所有类,比如,广本打算在每一辆汽车上装一个翅膀,那就需要在工厂中添加一个冲压机(以及各种车型的翅膀模具),还要在焊接科里添加这么一道工序,涂装科以及总装科里面也一样要进行相应的调整。

工厂子类不一定需要实现父类的所有方法,但要使子类有用的话,我们必须使它的所有方法宣布具体化。这里,就引出几种做法:1、工厂父类可以就是一个接口,以确保其子类一定是具体的;2、我们可以继承抽象的父类,但不完全具体化,这样可以继续细分工厂子类;3、抽象的父类中含有具体的方法,这些方法也可以不加virtual修饰符。最后的这种方法可能是比较灵活一点的。

抽象工厂主要是用在需要一系列相关联的类协同工作的地方,而且这些系列的数量可能会变多,每一个系列完成的工作都不一样,但是调用接口却是一样的。另外,抽象工厂不适合这样一种情况,即每个系列内部的元素数量不能够确定,也就是说,当初设计的时候,系列中有3个配件,后面又涨成5个,之后又涨到7个,这样的话,要改动的地方将多到让人受不了。

回到目录
上一篇:引子
下一篇:Builder

转载于:https://www.cnblogs.com/Reeezak/archive/2005/10/23/260493.html

白话设计模式——Abstract Factory相关推荐

  1. 设计模式——Abstract Factory(抽象工厂)模式

    抽象的零件:Item类 Item类是Link和Tray类的父类,这样Link和Tray类就具有可替换性了. caption字段表示项目的"标题" makeHTML方法是抽象,需要子 ...

  2. 图解设计模式-Abstract Factory模式

    抽象工厂的工作是将"抽象零件"组装成"抽象产品". 我们不关心零件的具体实现,而是只关心接口API.我们仅适用该接口API将零件组装成为产品. 角色: Abst ...

  3. 设计模式之抽象工厂模式(Abstract Factory)摘录

    面向对象系统的分析和设计实际上追求的就是两点:高内聚(Cohesion)和低耦合(Coupling). 23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.Fa ...

  4. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Facto ...

  5. 设计模式学习总结1 - 创建型1 - Abstract Factory抽象工厂模式

    AbstractFactory抽象工厂模式(创建型) 作用: 这种模式支持创建不同的对象,这些对象功能接近且一般都是在一起创建的.抽象工厂被具体化成不同的工厂来创建类似产品的不同产品.这种模式将类于使 ...

  6. 设计模式学习笔记——抽象工厂(Abstract Factory)模式

    设计模式学习笔记--抽象工厂(Abstract Factory)模式 @(设计模式)[设计模式, 设计模式中文名, 设计模式英文名] 设计模式学习笔记抽象工厂Abstract Factory模式 基本 ...

  7. 设计模式(6)——抽象工厂模式(Abstract Factory Pattern,创建型)

    1.概述 使用设计模式可以提高代码的可复用性.可扩充性和可维护性.抽象工厂模式(Abstract Factory Pattern)属于创建型模式,为创建一组相关或者相互依赖的对象(产品族)提供一个抽象 ...

  8. 设计模式的征途—4.抽象工厂(Abstract Factory)模式

    上一篇的工厂方法模式引入了工厂等级结构,解决了在原来简单工厂模式中工厂类职责太重的原则,但是由于工厂方法模式的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,从而增加系统开销.那么,我们应该 ...

  9. 【设计模式】抽象工厂模式 Abstract Factory Pattern

    简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...

最新文章

  1. 学java培训开发需要多少钱
  2. 杜克大学提出 AI 算法,拯救渣画质马赛克秒变高清
  3. linux下source insight安装以及打开
  4. 《剑指offer》-- 树的子结构、二叉树的镜像、二叉树的深度、平衡二叉树
  5. 构建创业公司突击小团队
  6. shuffle洗牌算法java_js打乱一个数组 的 洗牌(shuffle )算法
  7. 使用ceph-deploy搭建三节点ceph集群
  8. 客户永远是对的---我的理解:做事不要抱怨,别为失败找借口。
  9. 第四:搜索算法应用 - 四皇后问题
  10. PDF Converter OCR for Mac(pdf格式转换器及ocr识别工具)
  11. java并发编程(8)-- 线程 阻塞队列 生产者消费者 lock synchronized
  12. 微信小程序直接打开文件操作(pdf)
  13. 计算机科学怎么撤稿,撤稿Nature后,这所大学在撤Science!
  14. CanOpen协议栈学习笔记1-帧格式,SYNC和NMT报文介绍
  15. 青春如电,许多未了心愿
  16. [Anaconda] 不需要重装环境,解决引用scipy包时Could not find module ‘...gfortran-win_amd64.dll‘问题
  17. <JVM笔记:内存与垃圾回收>13-垃圾回收器
  18. NLP学院网:李斌NLP关键执行:由谁去给猫挂铃铛?
  19. Ubuntu python3.6的安装
  20. fig翻译_Fig. 2. (a) Loading equipment; (b) Distributi简体中文怎么写 - 什么意思? - 怎么翻译?...

热门文章

  1. 密码学专题 证书和CA指令 申请证书|建立CA|CA操作|使用证书|验证证书
  2. 面向区块链的高效物化视图维护和可信查询论文学习
  3. C语言typedef关键字—伟大的缝纫师
  4. 简述 maven 命令 package、install、deploy 的区别
  5. 各种学习资源 文档、手册 (Docker 、springboot 、Guava、git、logback 、Linux 、MQ、vue、Axios)
  6. 解决 VUE前端项目报错:RangeError: Maximum call stack size exceeded
  7. SpringBoot 之集成 Spring AOP
  8. 关于RESTful一些注意事项,接口开发规范
  9. PLSQL 安装+配置( Oracle数据库连接工具 )
  10. void和void *