文档章节

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

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

背景

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

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


1、使用意图

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


2、生活实例

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



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

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


4、模式类图

    

5、模式优点

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


6、与类似模式比较

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



© 著作权归作者所有

共有 人打赏支持
learn_more
粉丝 91
博文 240
码字总数 210196
作品 0
深圳
程序员
迈向大牛的重要一步——掌握设计模式

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

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

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

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

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

codeGoogle
09/04
0
0
JAVA基础再回首(二十六)——面向对象思想设计原则、设计模式、简单工厂模式、工厂方法模式、单例设计模式之饿汉式和懒汉式、Runtime类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m366917/article/details/52717096 JAVA基础再回首(二十六)——面向对象思想设计原则、设计模式、简单工厂模...

Aduroidpc
2016/10/01
0
0
C#设计模式(2)——简单工厂模式

一、引言   这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式——简单工...

技术小胖子
2017/11/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

docker update:更新一个或多个容器的配置

更新容器的配置 docker update:更新一个或多个容器的配置。 具体内容请访问:https://docs.docker.com/engine/reference/commandline/update/#options 语法:docker update [OPTIONS] CONTA...

lwenhao
44分钟前
1
0
unload事件

unload事件不触发的原因分析 1.代码位置不对,应该优先加载,不能放到回调函数中 2.浏览器不支持 3.最可能的原因,unload事件中触发的函数是一个异步执行的函数,浏览器是不允许在窗口关闭之后在...

狮子狗
57分钟前
1
0
DbForge Schema Compare for MySQL入门教程:如何连接到数据库

【dbForge Schema Compare for MySQL下载】 要创建连接: 1. 在“Connection” 工具栏上单击“New Connection”按钮 。 2. 在“Host” 框中输入主机名。 3. 在“Port” 框中输入端口信息。默...

Miss_Hello_World
59分钟前
1
0
spring中事务的应用

spring中事务管理的两种方式 编程式事务使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。 声明式事务是建立...

狂奔的熊二
今天
0
0
公众号关联微信小程序

公众号关联小程序发送关联通知,对于推广小程序有着很大的帮助。所以问题来了,怎么做到在公众号关联小程序发送关联通知呢? 一:开发中遇到的问题 之前在开发过程中发现,公众号已经关联小程...

Code辉
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部