动机

框架使用抽象类定义和维护对象之间的关系。这些对象的创建通常也由框架负责。

面向对象编程很多场合其实就是对抽象类编程。我们可以认为,抽象类+抽象类之间的协作构成了架构。在这样的架构中,通常也会包含对象的创建部分。

考虑这样一个应用框架,它可以向用户显示多个文档。在这个框架中,两个主要的抽象是类Application和Document。这两个类都是抽象的,客户必须通过它们的子类来做与具体应用相关的实现。例如,为创建一个绘图应用,我们定义类DrawingApplication和DrawingDocument。Application类负责管理Document并根据需要创建它们 — 例如,当用户从菜单中选择Open或New的时候。

这个例子,可以参考Office。Excel和Word的具体操作有很大的不同,但是如果从抽象的角度来看,Word和Excel都可以看作Application,而Word文档和Excel文档都可以抽象为Document。有了这样的观点之后,文件打开,关闭,保存,内容拷贝,粘贴等操作就构成了微软的应用程序开发架构。有了这个架构之后,就可以利用它开发自己的应用,例如绘图软件。这是由于大量的共通部分已经完成,开发者只要根据具体的需求提供相应的具象类就可以很快地开发出自己的应用了。

用户通过应用菜单选择打开或创建文件时,架构(实际上是Application)有义务创建相应的对象。

因为被实例化的特定Document子类是与特定应用相关的,所以Application类不可能预测到哪个Document子类将被实例化 —Application类仅知道一个新的文档何时应被创建,而不知道哪一种Document将被创建。这就产生了一个尴尬的局面:框架必须实例化类,但是它只知道不能被实例化的抽象类。

由于架构代码都是先于应用构建的,所以抽象的Application不可能知道具象的Document类的类型。也就是说架构需要实例化某些类,却不知道实际需要实例化的类型。

Factory Method模式提供了一个解决办案。它封装了哪一个Document子类将被创建的信息并将这些信息从该框架中分离出来,如下页上图所示。

为了解决这个问题,工厂方法模式提供了一种将创建具象Document类的部分从架构中分离出来的方法。

Application的子类重定义Application的抽象操作CreateDocument以返回适当的Document子类对象。一旦一个Application子类实例化以后,它就可以实例化与应用相关的文档,而无需知道这些文档的类。我们称CreateDocument是一个工厂方法(factorymethod),因为它负责“生产”一个对象。

首先在抽象Application类中定义抽象操作返回抽象Document的CreateDocument操作并在架构中使用。在开发具体应用时实现一个构建具象Document的具象Acpplication类并将其引入架构中。这个创建对象的方法就是工厂方法。

作者观点

古语有云:兵无常势,水无常形。我们可以说设计模式的运用场景多种多样,各有不同;但是古语也说万变不离其宗,设计模式的出发点其实还真就没有那么玄乎,只要真正领会多态的内涵,正确识别抽象和具体,变与不变,很多事情其实都是水到渠成的事情。

首先对基类(或者说抽象类)编程,然后通过组装的方式导入具象类可以说是所有架构的共同方式。

注:

本文中蓝色粗体文字都引自《设计模式》一书。

觉得本文有帮助?请分享给更多人。

更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】

Aha!设计模式(21)-工厂方法(2)相关推荐

  1. python类是实例的工厂_Python设计模式之工厂方法模式实例详解

    本文实例讲述了Python设计模式之工厂方法模式.分享给大家供大家参考,具体如下: 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类, ...

  2. 设计模式复习-工厂方法模式

     设计模式复习-工厂方法模式 相对于简单工厂,工厂方法是把算法类的实例化延迟到了调用者那去做,调用者根据自己的需要,自己实例化相关的工厂并且生产相关算法.这么做是因为简单工厂是不满足OCP的,因为如果 ...

  3. C#设计模式(3)——工厂方法模式

    一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是--简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以 ...

  4. 设计模式之工厂方法模式(创建型)

    一.模式定义 工厂方法模式:又称工厂模式,也叫虚拟构造器模式,属于构建型设计模式,工厂方法模式是在简单工厂模式上进行拓展,生产产品的过程由具体工厂类实现,基类只实现接口,这使得工厂方法模式可以在不修改 ...

  5. 设计模式之工厂方法模式应用例题

    设计模式之工厂方法模式应用例题 题目描述 类结构图及相关说明 程序代码 运行结果 题目描述 现需要设计一个程序来读取多种不同类型的图片格式,针对每一种图片格式都设计一个图片读取器(ImageReade ...

  6. 设计模式:工厂方法模式(Factory method)

    设计模式:工厂方法模式(Factory method) 一.问题 在前一章中通过披萨的实例介绍了简单工厂模式.在披萨实例中,如果我想根据地域的不同生产出不同口味的披萨,如纽约口味披萨,芝加哥口味披萨. ...

  7. 【设计模式】工厂方法模式(C#)

    [设计模式]工厂方法模式 1.概述 针对简单工厂中的缺点,使用工厂方法模式就可以完美的解决,完全遵循开闭原则. 定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象.工厂方法使一个产品类的实例化 ...

  8. 二、java设计模式之工厂方法+抽象工厂模式(创建型设计模式)

    创建型设计模式-工厂模式和应用 工厂模式介绍: 它提供了一种创建对象的最佳方式,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象 例子: 需要购买一辆车,不用管 ...

  9. 一文叫你弄懂Java设计模式之工厂方法模式:图解+日志记录器代码实例

    文章目录 详解Java设计模式之工厂方法模式 案例引入工厂方法模式 工厂方法模式 定义 案例分析 UML类图分析 代码分析 工厂方法的重载 工厂方法的隐藏 模式优点 模式缺点 模式适用环境 详解Jav ...

最新文章

  1. 编解码:Base64编码在URL中的应用
  2. ToString格式化
  3. python中缩进在程序中_有没有办法将Python代码中的缩进转换为大括号?
  4. sha256校验工具_使用AIDE工具做入侵检测
  5. SpringMVC从入门到精通之第一章_慕课文章
  6. C#中==操作符存在的缺陷
  7. CDN设置回源host的意义
  8. WPF利用NotifyIcon创建任务栏图标(菜鸟教程)
  9. 常见的Java框架有哪些?
  10. 联想Y7000装双系统win10+Ubuntu16.04后在Ubuntu上Wifi被禁用的解决办法
  11. Windows使用Dism备份操作系统快捷命令 系统备份
  12. 雪浪数制CEO王峰:关于雪浪制造大脑的三大拷问 | 2018雪浪大会
  13. request.querystring php,ASP_ASP读取Request.QueryString编码的函数代码,1. 支持参数纯汉字 ?a=深山老熊 - phpStudy...
  14. Oracle——SQL基础练习
  15. 原生小程序使用 flyio,以及拦截器
  16. 《疯狂Java讲义》第5章 面向对象(上)——课后练习
  17. 如何确保采购过程中的产品质量
  18. 66移动IP通信过程
  19. ping www.baidu.com出现www.a.shifen.com
  20. 为什么连麦对面能听到我电脑内部的声音

热门文章

  1. poj 1689 zoj 1422 3002 Rubbery (Geometry + BFS)
  2. 电源系统中磁珠的使用
  3. [Paper Summary] Evaluating repres. by the complexity of learning low-loss predictors [Whitney 2020]
  4. Kaggle实战(一):泰坦尼克获救预测
  5. xp计算机退出家庭组,win7电脑中如何退出加入的家庭组?
  6. JAVA蓝桥杯分解质因数
  7. [BZOJ4399]魔法少女LJJ(线段树合并)
  8. Spring+SpringMVC+Jsp实现校园二手交易系统
  9. 佛心禅语净灵台-转载
  10. c语言打字游戏程序设计报告,打字游戏程序设计汇报.doc