文档章节

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

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

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

先上UML图

简单工厂模式:

s1

工厂方法模式:

s2

抽象工厂模式:

s3

举例说明这三个模式

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

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

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

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

横向对比三者的优劣

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

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

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

适用范围

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

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

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

© 著作权归作者所有

共有 人打赏支持
奋斗到天明
粉丝 18
博文 112
码字总数 82707
作品 0
昌平
程序员
私信 提问
PHP设计模式(一):简介及创建型模式

我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式。 一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用、容易被他人理解的、可靠的代码设...

juhenj
2014/05/15
228
2
设计模式梳理(一)

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

lxq_xsyu
2017/11/02
0
0
炒冷饭系列:设计模式 抽象工厂模式

炒冷饭系列:设计模式 抽象工厂模式 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 亲爱我,孝何难;亲恶我,孝方贤。 一、什么是抽象工厂模...

泥沙砖瓦浆木匠
2014/07/24
0
0
23种设计模式(3):抽象工厂模式

定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。 类型:创建类模式 类图: 抽象工厂模式与工厂方法模式的区别 抽象工厂模式是工厂方法模式的升级版本,他用来...

LCZ777
2014/07/05
0
0
【设计模式之】 工厂模式

1、介绍 属于创建型设计模式,需要生成的对象叫做产品 ,生成对象的地方叫做工厂 。 使用场景:在任何需要生成复杂对象的地方,都可以使用工厂方法模式。 直接用new可以完成的不需要用工厂模...

卯金刀GG
02/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

2018最新Web前端经典面试试题及答案

javascript: JavaScript中如何检测一个变量是一个String类型?请写出函数实现 typeof(obj) === "string" typeof obj === "string" obj.constructor === String 请用js去除字符串空格? 方法一...

Jack088
9分钟前
0
0
大数据教程(10.1)倒排索引建立

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

em_aaron
14分钟前
0
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
14分钟前
1
0
MYSQL索引

索引的作用 索引类似书籍目录,查找数据,先查找目录,定位页码 性能影响 索引能大大减少查询数据时需要扫描的数据量,提高查询速度, 避免排序和使用临时表 将随机I/O变顺序I/O 降低写速度,占用磁...

关元
33分钟前
5
0
撬动世界的支点——《引爆点》读书笔记2900字优秀范文

撬动世界的支点——《引爆点》读书笔记2900字优秀范文: 作者:挽弓如月。因为加入火种协会的读书活动,最近我连续阅读了两本论述流行的大作,格拉德威尔的《引爆点》和乔纳伯杰的《疯传》。...

原创小博客
45分钟前
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部