文档章节

小菜学设计模式——工厂方法模式

learn_more
 learn_more
发布于 2015/06/07 10:47
字数 879
阅读 156
收藏 9

背景

    简单工厂模式最大的优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关类,对于客户端来说,去除了与具体产品的依赖。如果,项目需要扩展,新增一种产品需要简单工厂模式生产,那么工厂内部必须重写修改必要的逻辑判断,这对于面向接口编码是非常不愿意看到的,因为他违背了面向对象设计原则:开放封闭原则。

    那么如何我们才能解决这个问题呢?工厂方法模式的产生应该也是简单工厂模式的改进。


1、使用意图

    工厂方法模式实现时,客户端需要决定实例化化哪一个工厂方法来生产产品,换句话说,工厂方法模式就是仅仅把简单工厂模式的内部必要逻辑判断移到了客户端代码来进行,那么,以前是修改工厂类内部的逻辑判断,现在变成了修改客户端的业务逻辑,说实话,相对于简单工厂模式稍微好点,但是还是难以扩展。


2、生活实例

    生活处处是例子,只要有简单工厂模式的地方,自然可以调整为工厂方法模式。



3、Java 例子(框架、JDK 、JEE)

    还是说以前那个报表导出的例子,工厂方法模式的话应该这样写,建一个超级工厂接口,IExportFactory,里面声明一个抽象方法,这个方法就是生产对象,估计你也知道了,生产的对象肯定是所有产品的超类,那么,如果你想要一个PdfExport实例的话,需要定义一个 PdfExportFactory 实现 IExportFactory ,同时实现里面的方法,生产对应的PdfExport;那么客户端自己new 一个工厂,然后用工厂实例化对象;如果想要扩展一个产品,那么新增一个工厂类实现IExportFactory就可以了,呵呵,这个到底有什么好啊!


4、模式类图

    

5、模式优点

    谈不上什么优点,想想啊,简单工厂模式可以改进为静态工厂模式,就是把生产产品的方法设为静态的,而工厂方法呢?不可以,因为工厂方法模式重在方法,这个方法通过继承动态实现完成,所以可能是静态的。当然,工厂方法模式还可以改进为在一个工厂内部提供不同的方法来生成不同的产品,那么就可以避免过多的工厂类了,虽然这样子可以减少类,但是实际上它和简单工厂一样违背了开放封闭原则,如果后期扩展一个新的产品,那么必须在工厂内部中新增一个生产对应产品的方法。


6、与类似模式比较

    只能与简单工厂模式比较,因为抽象工厂还没没有深入学习,懂的不是很多;简单工厂模式和工厂方法模式没什么可说的,感觉代码就必须在if-else中度过。



© 著作权归作者所有

learn_more
粉丝 93
博文 240
码字总数 210196
作品 0
深圳
程序员
私信 提问
迈向大牛的重要一步——掌握设计模式

IT职场的小菜经常有这样的疑问: 为什么一个相似的功能,大牛一会儿就搞定,然后悠闲地品着下午茶逛淘宝;而自己加班加点搞到天亮还做不完。 为什么用户提出需求变更后,大牛只需潇洒地敲敲键...

一枚Sir
2015/04/10
321
0
小菜学设计模式——抽象工厂模式

背景 简单工厂、工厂方法模式,接着必须学习抽象工厂模式 1、使用意图 扩展工厂方法模式 2、生活实例 淘宝电影、猫眼电影都能为我们生成当天各种电影票 3、Java 例子(框架、JDK 、JEE) 个人...

learn_more
2015/06/13
237
0
小菜学设计模式——设计模式总结之创建型

1、面向过程与面向对象 1)面向过程通过划分功能模块,通过函数间相互调用来实现,但需求变化时就需要更改函数,而你改动的函数有多少地方在调用她呢?关联多少数据,这是很不容易弄得清楚地...

learn_more
2015/07/05
177
0
练就Java24章真经—你所不知道的工厂方法

前言 最近一直在Java方向奋斗《终于,我还是下决心学Java后台了》,今天抽空开始学习Java的设计模式了 。计划有时间就去学习,你这么有时间,还不来一起上车吗? 之所以要学习Java模式,是因...

codeGoogle
2018/10/30
0
0
小菜学设计模式——简单工厂模式

背景 很多时候我们不知道客户具体需要执行哪种类型的操作,但是客户会给出我们对应的提示信息,那么我们的程序必须能够根据参数信息进行动态操作,这样的程序才是一个可扩展的程序。简单工厂...

learn_more
2015/06/02
154
0

没有更多内容

加载失败,请刷新页面

加载更多

只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常

统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生。 比较通用的返回值格式如下:...

晓月寒丶
昨天
59
0
区块链应用到供应链上的好处和实际案例

区块链可以解决供应链中的很多问题,例如记录以及追踪产品。那么使用区块链应用到各产品供应链上到底有什么好处?猎头悬赏平台解优人才网小编给大家做个简单的分享: 使用区块链的最突出的优...

猎头悬赏平台
昨天
28
0
全世界到底有多少软件开发人员?

埃文斯数据公司(Evans Data Corporation) 2019 最新的统计数据(原文)显示,2018 年全球共有 2300 万软件开发人员,预计到 2019 年底这个数字将达到 2640万,到 2023 年达到 2770万。 而来自...

红薯
昨天
65
0
Go 语言基础—— 通道(channel)

通过通信来共享内存(Java是通过共享内存来通信的) 定义 func service() string {time.Sleep(time.Millisecond * 50)return "Done"}func AsyncService() chan string {retCh := mak......

刘一草
昨天
58
0
Apache Flink 零基础入门(一):基础概念解析

Apache Flink 的定义、架构及原理 Apache Flink 是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态或无状态的计算,能够部署在各种集群环境,对各种规模大小的数据进行快速...

Vincent-Duan
昨天
60
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部