文档章节

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

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

背景

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

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


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
C#设计模式(2)——简单工厂模式

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

技术小胖子
2017/11/08
0
0
小菜学设计模式——简单工厂模式

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

learn_more
2015/06/02
0
0
设计模式-抽象工厂模式(C#)

设计模式——抽象工厂模式(JAVA) 在抽象工厂模式中,一个具体工厂可以生产一组相关的具体产品,这样的一组产品成为产品族,产品族中的每一个产品都属于某一个产品继承等等级结构。当系统所...

PXZ6603
06/26
0
0
简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

转载:原地址http://www.cnblogs.com/zhangchenliang/p/3700820.html 简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别 结合简单示例和UML图,讲解工厂模式简单原理。 一、引子 话说...

法斗斗
05/08
0
0
小菜学设计模式——设计模式总结之创建型

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

learn_more
2015/07/05
0
0
设计模式2——Factory设计模式

Factory工厂设计模式为创建对象提供了一种抽象,而对使用者屏蔽了对象创建的具体细节过程,工厂模式有三种:简单工厂模式,抽象工厂模式和工厂方法模式。 1. 简单工厂模式: 又叫静态工厂模式...

小米米儿小
2013/12/05
0
0
Java设计模式之抽象工厂模式

抽象工厂模式特点 抽象工厂模式与工厂模式最大的区别是每个单独的产品是一个工厂模式,而多个不同产品交互则是抽象工厂模式,抽象工厂模式通常要运用工厂模式的方法。通常,工厂模式的所有产...

断桥残雪断桥残雪
2015/08/09
0
0
小菜学设计模式——设计模式总结之结构型

1、设计模式总结 设计模式总共23个,但是常用的不到10个,下面就把这23个设计模式进行整理归类,具体如下: 1)创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型...

learn_more
2015/07/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Python -re模块及正则表达式解析

传送门: https://blog.csdn.net/pipisorry/article/details/25909899 ps:上面文章中"命名分组"的语法格式不能执行。正确的如下: (?P<name>正则表达式) #name是一个合法的标识符...

一口今心
6分钟前
0
0
mybatis中session.getMapper方法源码分析

0开始代码AuthorMapper mapper = session.getMapper(AuthorMapper.class); 1 DefaultSqlSession类 @Override public <T> T getMapper(Class<T> type) { //最后会去调用MapperRegistry.getMap......

writeademo
14分钟前
0
0
spring cloud zuul网关的作用

zuul一般有两大作用,1是类似于Nginx的网址重定向,但zuul的重定向的一般是整个spring cloud里在Eureka注册中心的模块. zuul: ignored-services: '*' sensitiveHeaders: routes: ...

算法之名
14分钟前
6
0
java按比例之原图生成缩略图

package com.wxp.test; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import javax.imageio.ImageIO; import sun.......

恋码之子
24分钟前
0
0
SpringCloud 微服务 (十五) 服务容错 Hystrix

壹 工作中的微服务架构,某个服务通常会被多个服务调用或者多层调用完成需求,如果某个服务不可用,导致一个系统功能不可用或者服务直接没用了的情况,这种情况称为雪崩效应 有A服务调用B服务,B服...

___大侠
26分钟前
0
0
Spring框架中的设计模式(五)

Spring框架中的设计模式(五) 通过以前的4篇文章,我们看到Spring采用了大量的关于创建和结构方面的设计模式。本文将描述属于行为方面的两种设计模式:命令和访问者。 前传: Spring框架中的...

瑞查德-Jack
29分钟前
0
0
解决phpstorm运行很卡问题!

phpStorm一旦达到这个临界值,所有智能提示、自动补全都失效了 这TM就很尴尬了,顿时感觉自己就是个废人了,纯手写代码跟便秘一样 众所周知phpStorm基于JAVA,那么这个内存限制肯定跟JAVA的虚...

sjcehui2010
32分钟前
0
0
javascript前端AES加密解密

参考了一下网上的代码加上自已的一些想法,修改,key也可以是中文, 要引入一个aes.js的js文件。 html代码 <html> <head> <title>AES加解密</title> <meta http-equiv="Content-Type"......

oisan_
35分钟前
0
0
MacOS和Linux内核的区别

有些人可能认为MacOS和Linux内核有相似之处,因为它们可以处理类似的命令和类似的软件。甚至有人认为苹果的MacOS是基于linux的。事实上,这两个内核的历史和特性是非常不同的。今天,我们来看...

六库科技
40分钟前
0
0
Vue.js-自定义事件例子

自定义组件的 v-model 2.2.0+ 新增 一个组件上的 v-model 默认会利用名为 value 的 prop 和名为 input 的事件,但是像单选框、复选框等类型的输入控件可能会将 value 特性用于不同的目的。m...

tianyawhl
43分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部