文档章节

小菜学设计模式——抽象工厂模式

learn_more
 learn_more
发布于 2015/06/13 14:39
字数 1050
阅读 228
收藏 10

背景

    简单工厂、工厂方法模式,接着必须学习抽象工厂模式

1、使用意图   

    扩展工厂方法模式


2、生活实例

    淘宝电影、猫眼电影都能为我们生成当天各种电影票


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

    个人觉得实实在在的根据抽象工厂模式定义的类应该会很少,毕竟不方便扩展,虽然它是一种很了不起的思想。一般都会采用反射机制+抽象工厂完成,比如,JDBC模块,在使用DriverManger.getConnection 这一步之前,必须要先加载驱动,也就是 Class.forname(class);这里指定class,通过这一步就可以创建驱动实例,也就是通过反射和工厂模式为应用注入了对象;Spring 核心之一 IoC 采用的也是反射机制+工厂模式来完成。

4、模式类图

  

5、模式优点

    抽象工厂模式:提供一个创建一系列相关或相互依赖的对象的接口,而无需指定他们的具体类。

    最大的优点是:容易交换产品系列,在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,他只需要改变具体工厂即可使用不同的产品配置。

    其次,他让具体创建实例过程与客户端分离,客户端是通过他们的抽象接口操作实例,产品的具体类别也被具体工厂实现分离,不出现在客户端代码中。

6、与类似模式比较

    我们知道简单工厂模式(静态工厂模式)就是简单的把对象的创建过程移到了工厂当中,通过对客户端传入的参数flag进行判断生成对应的product对象;具体类图如下:

这个模式最大的优点是把对象生成的复杂逻辑与客户端进行分离,这些逻辑判断通通交给了工厂,所以缺点也很明显,只要新增一种产品,他就需要修改工厂里面的逻辑判断;

    接着,工厂方法模式则是简单工厂模式的一种改进,他把生成对象的逻辑判断移到客户端,有客户端自己来决定初始化哪个需要的类,那么,当你需要新增一种产品时,只需要新增一个工厂类,就可以达到目的,这样克服了简单工厂模式违背的开放封闭原则。具体类图如下:

当你需要,新增一种产品时,就可以通过新增一个ConcreteFactory类实例化一个ConcreteProduct,客户端则更具自己需要来选择具体的ConcreteFactory。相比简单工厂,可以这么说,工厂方法模式其实就是增加了工厂。

    然后,就是抽象工厂模式,抽象工厂模式是在专门的条件下生成,比较简单工厂和工厂模式可以知道,他们生产的对象都有一个共同点,那就是生产的对象都是Product的子类,这些对象都是一类产品。可是如果我还想生成不是Product子类的产品怎么办呢?那么,抽象工厂模式就是在工厂方法模式上扩展,把createProduct新增扩展为CreateProductA和CreateProductB,甚至更多!就可以生成ProductA的子类,也可以生成ProductB的子类了。因为ProductA的子类可能有很多,所以 ConcreteFactory也就会有很多,而且ProductA和ProductB一般都是同属一个家族。最后,你发现如果需要新增ProductC时,这个扩展起来可真不容易........

    最后,抽象工厂模式就是工厂方法模式的扩展,工厂方法模式就是简单工厂的改进。


本文参考:

http://my.oschina.net/sunchp/blog/363483

© 著作权归作者所有

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

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

一枚Sir
2015/04/10
0
0
Java设计模式之抽象工厂模式

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

断桥残雪断桥残雪
2015/08/09
0
0
简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

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

法斗斗
05/08
0
0
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.1K
69
设计模式梳理(一)

设计模式梳理(一) 总体来说设计模式分为三大类: @案例源码地址:https://gitlab.com/lxqxsyu/DisgnPattern 创建型模式 简单工厂模式 工厂类是整个模式的关键。它包含必要的判断逻辑,能够...

lxq_xsyu
2017/11/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

oh-my-zsh 自定义

GitHub 地址 基于 oh-my-zsh 的自定义配置,增加了一些个人常用插件与皮肤。 采用的是 git submodule 来维护,包括 oh-my-zsh,之所以这么搞,主要是手头有多台 linux 需要维护, 每台机器、...

郁也风
今天
4
0
Docker安装踩坑:E_FAIL 0x80004005的解决

参考 菜鸟教程--Windows Docker 安装 http://www.runoob.com/docker/windows-docker-install.html 官方文档-Install Docker Toolbox on Windows https://docs.docker.com/toolbox/toolbox_in......

karma123
今天
5
0
js垃圾回收机制和引起内存泄漏的操作

JS的垃圾回收机制了解吗? Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行。 JS中最常见的垃圾回收方式是标记清除。 工作原理:是当变量进入环境时,将这个变量标记为“...

Jack088
昨天
17
0
大数据教程(10.1)倒排索引建立

前面博主介绍了sql中join功能的大数据实现,本节将继续为小伙伴们分享倒排索引的建立。 一、需求 在很多项目中,我们需要对我们的文档建立索引(如:论坛帖子);我们需要记录某个词在各个文...

em_aaron
昨天
27
0
"errcode": 41001, "errmsg": "access_token missing hint: [w.ILza05728877!]"

Postman获取微信小程序码的时候报错, errcode: 41001, errmsg: access_token missing hint 查看小程序开发api指南,原来access_token是直接当作parameter的(写在url之后),scene参数一定要...

两广总督bogang
昨天
31
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部