文档章节

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

奋斗到天明
 奋斗到天明
发布于 2015/08/27 16:37
字数 1567
阅读 69
收藏 0
点赞 0
评论 0

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

先上UML图

简单工厂模式:

s1

工厂方法模式:

s2

抽象工厂模式:

s3

举例说明这三个模式

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

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

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

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

横向对比三者的优劣

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

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

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

适用范围

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

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

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

© 著作权归作者所有

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

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

lxq_xsyu ⋅ 2017/11/02 ⋅ 0

简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

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

法斗斗 ⋅ 05/08 ⋅ 0

【设计模式之】 工厂模式

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

卯金刀GG ⋅ 02/27 ⋅ 0

设计模式Java Design Pattern-工厂方法模式FactoryMethod

我的博客 一、 设计模式的分类 大体可以分为三类: 创建型模式(5个) 单例模式、原型模式、工厂方法模式、抽象工厂模式、建造者模式 结构性模式(7个) 适配器模式、装饰器模式、代理模式、...

勇敢写信 ⋅ 03/22 ⋅ 0

[设计模式]简单工厂模式

简介 简单工厂模式 (Simple Factory) 又叫静态工厂方法(Static Factory Method)模式。 简单工厂模式通常是定义一个工厂类,这个类可以根据不同变量返回不同类的产品实例。 简单工厂模式是一...

静默虚空 ⋅ 2015/06/03 ⋅ 0

C#设计模式(2)——简单工厂模式

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

技术小胖子 ⋅ 2017/11/08 ⋅ 0

代理模式(Proxy Pattern):动态代理 - 最易懂的设计模式解析

前言 今天我来全面总结开发中最常用的设计模式 - 代理模式中的动态代理模式 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析 简单工厂模式(Sim...

Carson_Ho ⋅ 04/09 ⋅ 0

从ES6重新认识JavaScript设计模式(二): 工厂模式

1 什么是工厂模式? 工厂模式是用来创建对象的一种最常用的设计模式。我们不暴露创建对象的具体逻辑,而是将将逻辑封装在一个函数中,那么这个函数就可以被视为一个工厂。工厂模式根据抽象程度...

Lee_tanghui ⋅ 04/05 ⋅ 0

你需要了解的23种JavaScript设计模式

为什么要学习设计模式? 在许多访谈中,你可能会遇到很多面向对象编程中的接口,抽象类,代理和以及其他与设计模式相关的问题。 一旦了解了设计模式,它会让你轻松应对任何访谈,并可以在你的...

java高级架构牛人 ⋅ 06/02 ⋅ 0

设计模式.策略模式

策略模式跟抽象工厂非常相似,基本逻辑是根据需要实例化出需要用的类。不同的是策略模式需要调用者非常清晰的知道有哪些策略,各个策略的调用规则,而抽象工厂的话,需要知道有哪些类,找到调...

技术小胖子 ⋅ 2017/11/08 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

博客迁移到 https://www.jianshu.com/u/aa501451a235

博客迁移到 https://www.jianshu.com/u/aa501451a235 本博客不再更新

为为02 ⋅ 39分钟前 ⋅ 0

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 今天 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 今天 ⋅ 0

浅谈设计模式之工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻...

佛系程序猿灬 ⋅ 今天 ⋅ 0

Dockerfile基础命令总结

FROM 指定使用的基础base image FROM scratch # 制作base image ,不使用任何基础imageFROM centos # 使用base imageFROM ubuntu:14.04 尽量使用官方的base image,为了安全 LABEL 描述作...

ExtreU ⋅ 昨天 ⋅ 0

存储,对比私有云和公有云的不同

导读 说起公共存储,很难不与后网络公司时代的选择性外包联系起来,但尽管如此,它还是具备着简单和固有的可用性。公共存储的名字听起来也缺乏专有性,很像是把东西直接堆放在那里而不会得到...

问题终结者 ⋅ 昨天 ⋅ 0

C++难点解析之const修饰符

C++难点解析之const修饰符 c++ 相比于其他编程语言,可能是最为难掌握,概念最为复杂的。结合自己平时的C++使用经验,这里将会列举出一些常见的难点并给出相应的解释。 const修饰符 const在c...

jackie8tao ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部