文档章节

模式总结之工厂三模式: 简单工厂模式 Vs 抽象工厂模式 Vs 工厂方法模式

奋斗到天明
 奋斗到天明
发布于 2015/08/27 16:37
字数 1567
阅读 116
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

本文对比简单工厂、抽象工厂、工厂方法三个模式,有列举出UML图,但是没有java代码,再后面有生动地形象的列举。

先上UML图

简单工厂模式:

s1

工厂方法模式:

s2

抽象工厂模式:

s3

举例说明这三个模式

简单工厂模式:三国街街头,张飞和儿子张苞一起开了个肉铺,客人只要说来份好爸爸猪肉或者好儿子猪肉,张飞或者张苞就会给客人杀完猪,切完肉,然后交给客人。 

工厂方法模式:三国街街尾,关羽开了一家好爸爸红枣店,专门卖好爸爸红枣。他儿子关兴也开了一家好儿子红枣店,专门卖好儿子红枣。客人只要走到关羽的店子,说来份枣,关羽直接就给客人包裹了一袋好爸爸红枣。走到关兴的店说来份枣,关兴给客人包裹了一袋好儿子红枣。 

抽象工厂模式:后来经济不景气,三国街竞争太大,张家与关家决定联合起来!街头,关羽与张飞开了家好爸爸农副产品店,买好爸爸猪肉和好爸爸红枣,客人说来份肉或枣,就可以直接给客人买好爸爸猪肉或好爸爸红枣。街尾,关兴与张苞开了家好儿子农副产品店,客人说来份肉或枣,就可以直接给客人买好儿子猪肉或好爸爸红枣。 

在上面的例子中,店铺就是工厂,猪肉与红枣就是产品族,好爸爸红枣店、好儿子红枣店是工厂店的实现类,好爸爸猪肉、好儿子猪肉、好爸爸红枣、好儿子红枣就是具体产品,好爸爸红枣点,好儿子红枣点,好爸爸农副产品店,好儿子农副产品店是具体的工厂。

横向对比三者的优劣

简单工厂: 优点是调用者不用创建产品对象,只要传递种类信息即可,这样外界与具体类实现了隔离。缺点是工厂类有判断逻辑,扩展困难,违反了开闭原则,而且如果工厂类出问题,系统可能都会受影响。 用上面了例子来说,优点是客人不用走到具体的店铺,只要走到张飞肉铺(不像第二个例子的红枣店,得去两个不同的店铺),说出想要的肉即可。缺点是只有一个店铺,如果店铺出问题了,那就卖不出肉了,而且以后要想卖好老婆猪肉,好媳妇猪肉,店铺就会变得臃肿,还有每种肉处理流程不一样,在一起卖杀猪放配料可能会搞混。 

工厂方法: 优点是克服了简单工厂的缺点,符合开闭原则,容易扩展。缺点是当修改具体产品类时,对应的工厂类也得修改,当修改多个产品类时,那就相当麻烦。 用到上面例子中,优点就是卖红枣时流程不会搞混,不管以后再卖好媳妇红枣,好老婆红枣只要开新店,完全没问题。缺点就是如果忽然上级命令所有农副产品必须用双氧水消毒,那么关羽家族的所有店铺都必须修改流程,添加双氧水,而第一个例子中的张飞家族就没有这个顾虑。 

抽象工厂: 优点是一个工厂封装创建产品对象的责任和过程,它将客户与类的实现分离,只需改变具体的工厂就可以使用不同的产品配置,有利于产品的一致性,当一个系列中的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象。缺点是难以支持新的产品等级结构,支持新的产品等级结构就要扩展抽象工厂接口。 用第三个例子解释就是,每个农副产品铺子都有特有的主题,如好爸爸/好儿子,提供好爸爸/好儿子系列产品,可能爸爸们喜欢熟透的东西,儿子们喜欢加辣,所以可以统一给所有产品加辣,节省流程。缺点是如果农副产品店又说要买刘备家草鞋,那么所有的农副产品店都要添加草鞋产品。

适用范围

简单工厂:工厂类负责创建的对象比较少,客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心。 

工厂方法:当一个类不知道它所必须创建对象的类或一个类希望由子类来指定它所创建的对象时,当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候,可以使用工厂方法。 

抽象工厂:一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。这个系统有多于一个的产品族,而系统只消费其中某一产品族。同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。 总而言之,无论是简单工厂模式、工厂模式还是抽象工厂模式,它们本质上都是将不变的部分提取出来,将可变的部分留作接口,以达到最大程度上的复用。究竟用哪种设计模式更适合,这要根据具体的业务需求来决定。

奋斗到天明
粉丝 19
博文 112
码字总数 82707
作品 0
昌平
程序员
私信 提问
加载中
请先登录后再评论。
Netty那点事(三)Channel与Pipeline

Channel是理解和使用Netty的核心。Channel的涉及内容较多,这里我使用由浅入深的介绍方法。在这篇文章中,我们主要介绍Channel部分中Pipeline实现机制。为了避免枯燥,借用一下《盗梦空间》的...

黄亿华
2013/11/24
2W
22
访问安全控制解决方案

本文是《轻量级 Java Web 框架架构设计》的系列博文。 今天想和大家简单的分享一下,在 Smart 中是如何做到访问安全控制的。也就是说,当没有登录或 Session 过期时所做的操作,会自动退回到...

黄勇
2013/11/03
3.6K
8
Swift百万线程攻破单例(Singleton)模式

一、不安全的单例实现 在上一篇文章我们给出了单例的设计模式,直接给出了线程安全的实现方法。单例的实现有多种方法,如下面: class SwiftSingleton { } 这段代码的实现,在shared中进行条...

一叶博客
2014/06/20
3.5K
16
beego API开发以及自动化文档

beego API开发以及自动化文档 beego1.3版本已经在上个星期发布了,但是还是有很多人不了解如何来进行开发,也是在一步一步的测试中开发,期间QQ群里面很多人都问我如何开发,我的业余时间实在...

astaxie
2014/06/25
2.7W
22
树莓派(Raspberry Pi):完美的家用服务器

自从树莓派发布后,所有在互联网上的网站为此激动人心的设备提供了很多有趣和具有挑战性的使用方法。虽然这些想法都很棒,但树莓派( RPi )最明显却又是最不吸引人的用处是:创建你的完美家用...

异次元
2013/11/09
7.7K
8

没有更多内容

加载失败,请刷新页面

加载更多

Subversion存储库中“分支”,“标记”和“主干”的含义是什么?

问题: I've seen these words a lot around Subversion (and I guess general repository) discussions. 我已经在Subversion(我猜通用存储库)讨论中看到了很多这样的话。 I have been us......

富含淀粉
今天
5
0
《Java8实战》笔记(03):Lambda表达式

本文源码 Lambda 管中窥豹 可以把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。 Lambda表达...

巨輪
今天
7
0
从其他文件夹导入文件 - Importing files from different folder

问题: I have the following folder structure. 我有以下文件夹结构。 application/app/folder/file.py and I want to import some functions from file.py in another Python file which r......

javail
今天
22
0
大数据研发学习之路--Hadoop集群搭建

阅读编译文档 准备一个hadoop源码包,我选择的hadoop版本是:hadoop-2.7.7-src.tar.gz,在hadoop-2.7.7的源码 包的根目录下有一个文档叫做BUILDING.txt,这其中说明了编译hadoop所需要的一些...

DSJ-shitou
今天
8
0
OSChina 周五乱弹 —— 特么是别的公司派来的特洛伊木马吧?

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 小小编辑推荐:《我会守在这里》- 毛不易 《我会守在这里》- 毛不易 手机党少年们想听歌,请使劲儿戳(这里) @FalconChen :股市连跪了五天,...

小小编辑
今天
77
2

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部