文档章节

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

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

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

先上UML图

简单工厂模式:

s1

工厂方法模式:

s2

抽象工厂模式:

s3

举例说明这三个模式

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

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

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

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

横向对比三者的优劣

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

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

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

适用范围

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

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

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

© 著作权归作者所有

共有 人打赏支持
奋斗到天明
粉丝 18
博文 112
码字总数 82707
作品 0
昌平
程序员
设计模式梳理(一)

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

lxq_xsyu
2017/11/02
0
0
JavaScript设计模式系列一之工厂模式(附案例源码)

文章初衷 设计模式其实旨在解决语言本身存在的缺陷, 目前javaScript一些新的语法特性已经集成了一些设计模式的实现, 大家在写代码的时候,没必要为了用设计模式而去用设计模式, 那么我这边为什...

小钱钱阿圣
2017/09/08
0
0
23种设计模式(3):抽象工厂模式

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

LCZ777
2014/07/05
0
0
炒冷饭系列:设计模式 抽象工厂模式

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

泥沙砖瓦浆木匠
2014/07/24
0
0
我的Java设计模式-策略模式

今天给大家说说田忌赛马的故事。如有雷同,纯属巧合!话说在战国时期,群雄割据,硝烟四起,茶余饭后还是少不了娱乐活动的,其中赛马是最火爆的。一天,孙膑看到田忌像个死鸡似的就知道肯定赛...

Jet啟思
2017/11/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

golang使用protobuf简易教程

参考文档:https://blog.csdn.net/qq_15437667/article/details/78425151 一、安装protobuf # 去github.com/golang/protobuf下载源码包,# 拷贝到 $GOPATH/src/github.com/golang/protobuf......

科陆李明
29分钟前
0
0
8月16日 上课截图

小丑鱼00
44分钟前
0
0
Nginx负载均衡、配置SSL

Nginx负载均衡 在 /usr/local/nginx/conf/vhost/ 下创建一个文件,写入以下内容 加载后用curl测试可以访问设置的网站 www.qq.com ssl原理 HTTPS是一种加密的http协议,如果HTTP通信的数据包在...

黄昏残影
48分钟前
0
0
String 源码阅读笔记

String源码阅读 本人学习笔记,内容来自于阅读源码和其他博客,水平有限,如有错误,烦请指正。 详情参考: Java 7 源码学习系列(一)——String 请别再拿“String s = new String("xyz");...

等到烟火清凉_
48分钟前
4
0
Coding and Paper Letter(十二)

资源整理。<!-- more --> 1 Coding: 1.R语言生成的ppt,GeoStat2018会议报告,时空模式分析的报告。 geostat18 2.欧空局哨兵和SMOS的工具集,关于对地观测数据的处理与分析的docker容器。 ...

胖胖雕
49分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部