工厂方法模式的定义

定义: 定义一个用于创建对象的接口,让子类决定实例化哪一个类. 工厂方法使一个类的实例化延迟到其子类

工厂方法模式的通用类图:

其中 Product 负责产品的共性,实现对事物最抽象的定义; Creator 为抽象创建类, 也就是抽象工厂, 具体如何创建产品类是由具体的实现工厂 ConcreteCreator 完成的. 下面给出他们的代码:

产品抽象类代码:

具体产品类继承自抽象产品类,抽象工厂负责定义产品对象的产生,代码如下;

具体工厂类的实现代码如下:

工厂方法模式的优点

  1. 良好的封装性,代码结构清晰. 一个对象创建是有条件约束的, 如一个调用者需要一个具体的产品对象,只要知道产品的类名就可以了, 不用知道对象是如何创建的,降低模块间的耦合
  2. 工厂方法模式的扩展性非常优秀. 在增加产品类的情况下, 只要适当的修改具体的工厂类或扩展一个工厂类, 就可以完成"拥抱变化".
  3. 屏蔽产品类. 产品类的实现如何变化,调用者都不需要关心,它只需要关心产品的接口, 只要接口保持不变, 系统中的上层模块就不用发生变化. 因为产品类的实例化是由工厂类负责的,一个产品对象具体由哪一个产品生成是由工厂类决定的.
  4. 工厂方法模式是典型的解耦框架. 高层模块只需要知道产品的抽象类, 其他的实现类都不用关心.

工厂方法模式的使用场景

  1. 工厂方法模式是new一个对象的替代品,所以在所有需要生成对象的地方都可以使用,但是要考虑是否要增加一个工厂类进行管理,增加代码复杂度
  2. 需要灵活的、可扩展的框架时,可以考虑采用工厂方法模式.
  3. 工厂方法模式可以用在异构项目中,
  4. 可以使用在测试驱动开发的框架下. 例如, 测试一个类A,就需要把与类A有关联关系的类B也同时生产出来,我们可以使用工厂方法模式把类B虚拟出来,避免类A与类B的耦合.

工厂方法模式的扩展

工厂方法模式有很多扩展,而且与其他模式结合使用威力更大,下面介绍四种扩展

1.缩小为简单工厂模式

一个模块仅需要一个工厂类,那就没有必要把他产生出来,使用静态方法就可以了,在使用的时候也就不用将类实例化, 直接使用即可. 调用者也比较简单, 缺点是工厂类的扩展比较困难, 不符合开闭原则

2.升级为多个工厂类

当我们在做一个比较复杂的项目时,经常会遇到初始化一个对象很耗费精力的情况,所有的产品类都放到一个工厂方法中进行初始化会使代码结构不清晰. 考虑到需要结构清晰, 我们为每个产品定义一个创造者, 好处是创建类的职责清晰,而且结构简单, 但是给可扩展性和可维护性带来了一定的影响. 当然, 在复杂的应用中一般采用多工厂的方法, 然后再增加一个协调类, 避免调用者与各个子工厂交流,协调类的作用是封装子工厂类,对高层模块提供统一的访问接口.

3.替代单例模式

当类的构造方法为私有时, 可以通过反射来创建一个实例,然后通过工厂获得该类的唯一实例

4.延迟初始化

就是一个对象被消费完毕后,并不立刻释放,工厂类保持其初始状态,等待再次被使用.

延迟加载框架是可以扩展的, 例如限制某一个产品类的最大实例化数量,可以通过判断Map中已有的对象数量来实现,这样的处理是非常有意义的.

延迟加载还可以用在对象初始化比较复杂的情况下,例如硬件访问,设计多方面的交互,则可以通过延迟加载降低对象的产生和销毁带来的复杂性


工厂方法模式在项目中使用的非常频繁,以至于很多代码中都包含工厂方法模式. 而且工厂方法模式还可以与其它模式混合使用,变化出无穷的优秀设计,这也正是软件设计和开发的乐趣所在.

23种设计模式之工厂方法模式相关推荐

  1. 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之工厂方法模式

    · 工厂方法模式在王者荣耀中的应用 · 一.简述 王者荣耀这款游戏目前一共有100位英雄,游戏设计师根据英雄技能.属性.天赋等因素,将英雄划分为射手.辅助.打野.法师.坦克.战士等职业. 在本实例中, ...

  2. 23种设计模式之工厂方法模式(黑马程序员)

    工厂方法模式 一.概述 二.结构 三.实现 四.总结 在最后 一.概述 定义一个用户创建对象的工厂(接口),让接口的子类决定去实例化哪个对象,依赖其抽象编程.即工厂方法使一个类的实例化延迟到其工厂的子 ...

  3. 一天一种设计模式之六-----工厂方法模式

    2019独角兽企业重金招聘Python工程师标准>>> 一.工厂方法模式 工厂方法模式属于创建型模式. 工厂方法模式定义:定义一个用于创建对象的借口,让子类决定实例化哪一个类.工厂方 ...

  4. 备战面试日记(3.3) - (设计模式.23种设计模式之结构型模式)

    本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.9 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...

  5. 备战面试日记(3.2) - (设计模式.23种设计模式之创建型模式)

    本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.6 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...

  6. 备战面试日记(3.4) - (设计模式.23种设计模式之行为型模式)

    本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.12 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文 ...

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

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

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

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

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

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

最新文章

  1. 开源sk-dist,超参数调优仅需3.4秒,sk-learn训练速度提升100倍
  2. 监控目前所有连接SQL SERVER的用户信息
  3. 什么是计算机系统的可信基点,基于可信基点的结构化签名比较算法.pdf
  4. MongoDB的介绍和使用场景
  5. Android 开发之 GridView及其事件监听
  6. HTTPClient 出现Cannot inherit from final class
  7. 前端学习笔记之DOM(一)
  8. 七步从AngularJS菜鸟到专家(6):服务
  9. mysql读写分离-借助中间键mycat
  10. webstrom中使用git
  11. LINUX:Contos7.0 / 7.2 LAMP+R 下载安装Php篇
  12. OpenCV读取一张图片,并将其转换为灰度图像显示
  13. 小米路由pro php,完全拆解小米路由器Pro:无接口,预加硬盘无望
  14. 计算机excel减法函数,excel减法函数的使用
  15. 11g OCM 考试感悟
  16. VOT 2019 RGB-TIR数据集下载教程
  17. 多维数据模型中维度、度量、层级理解
  18. 「设计模式(二) - 观察者模式」
  19. badger框架学习 (一)
  20. 操作系统-动态内存分配算法

热门文章

  1. sync.Map 源码学习
  2. 数据库---事务的隔离级别
  3. iOS中NSLog的优化使用
  4. iOS中的XML解析
  5. verilog 浮点转定点_定点数和浮点数
  6. linux卸载openjdk_Linux系列(七)——linux其他指令【rpm、yum、sudo】
  7. 农历php,PHP农历公历转换
  8. java 调用jira_java调用jira接口
  9. requestbody前端怎么传_学习前端开发前的基础知识了解「V1001」
  10. python什么元素为真_如何使用Python基础内置函数