`
shangjava
  • 浏览: 1188330 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

设计模式区别(一)

阅读更多

最近一段时间一直在学习设计模式,我有一个感受就是:接触头几个设计模式时感觉似乎就那么一回事,好像没有什么可学习的,因为理解起来很简单,也很容易记忆,在例子的带动下似乎也有那么一点意思了,好像自己懂了。慢慢地,随着学习的深入,接触到了各种各样的设计模式,前面那种轻松的劲儿就没了,越学越迷糊,感觉很多模式好像都是类似的,自己也分不清和前面学的模式的区别是什么了。再后来,经过对这23种基本的设计模式仔细研究,对比其实现类图以及模式使用的目的,基本上清楚明白了各个设计模式之间的区别以及他们各自的使用范围,为了使和我一样在学习设计模式的朋友少一些迷惑,我将我认为的一些类似的、容易混淆的设计模式之间的区别总结出来共享给大家,希望能有所帮助,如有谬误,欢迎指正。

在进入正题之前,首先来了解一些基本的东西,有助于理解设计模式。

在面向对象编程中,理解对象、接口、类和继承子类的概念对大多数人来说并不困难,问题关键在于如何运用它们写出灵活的、可复用的软件,而设计模式则可以告诉你如何去做。

面向对象系统中功能复用最常用的技术是类继承对象组合。类继承属于白盒复用,也就是说通过生成子类来达到复用的目的,父类的内部细节对子类可见;对象组合属于黑盒复用,对象的内部细节是不可见的,对象组合要求被组合的对象具有良好定义的接口。针对以上的复用技术,我们需要遵守两条原则:第一,针对接口编程,而不是针对实现编程;第二,优先使用对象组合,而不是类继承。

针对接口编程有两个好处:第一个好处是客户不需要知道他们使用的对象的特定类型 ,只须对象有客户所期望的接口;第二个好处是客户无须知道他们使用的对象是用什么类来实现的,他们只须知道定义的接口或者抽象类。这将极大的减少子系统实现之间的相互依赖关系。

优先使用对象组合的优点是:第一,由于对象的实现是基于接口编写的,所以在实现上存在较少的依赖关系,可以在运行时刻动态的替换引用的对象实现;第二,优先使用对象组合有助于保持每个类背封装,并被集中在单个任务上,这样类和类的继承层次会保持在较少的规模,并且不太可能增长为不可控制的庞然大物;第三,使用对象组合可以最大限度的不用创建新的构件,而使用已有的构件就可以组装获得所需要的功能。

设计模式就采用了大量的对象复合技术。设计模式按照目的划分,可以分为创建型、结构型、行为型三种,其中创建型模式与对象的创建有关,结构型模式处理类或对象的组合;行为型模式对类或对象怎样交互和怎样分配职责进行描述。

下面是各种模式按照目的划分的分类

创建型模式:Factory Method、Abstract Factory、Builder、Prototype、 Singleton

构造型模式:Adapter、Bridge、Composite、Decorator、Façade、Flyweight、
Proxy

行为型模式:Chain of Responsibility、Command、Iterator、Mediator、Mementor、Memento、Observer、State、Stategy、Visitor、Template Method、
Interpreter

<shapetype id="_x0000_t75" coordsize="21600,21600" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75"><font size="3"><font face="宋体"> <stroke joinstyle="miter"></stroke></font></font><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock><shape id="_x0000_s1044" style="MARGIN-TOP: 69.05pt; Z-INDEX: 1; LEFT: 0px; MARGIN-LEFT: 94.5pt; WIDTH: 417pt; POSITION: absolute; HEIGHT: 267pt; TEXT-ALIGN: left; mso-position-horizontal-relative: text; mso-position-vertical-relative: text; mso-position-horizontal: absolute; mso-position-vertical: absolute" type="#_x0000_t75"><imagedata o:title="" src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.png"></imagedata><wrap type="square"></wrap></shape><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 417pt; HEIGHT: 267pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.png"></imagedata></shape>

<shapetype id="_x0000_t75" coordsize="21600,21600" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 417pt; HEIGHT: 267pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.png"></imagedata></shape>

创建型模式之间的区别

GoF23种设计模式中创建型模式有5种,分别是:Singleton单件模式、Abstract Factory抽象工厂模式、Builder生成器模式、Factory Method工厂方法模式、Prototype原形模式。由于创建型模式与对象创建有关,所以这几种模式一般不会与其他的结构型模式和行为型模式混淆,这里将创建型模式单独列出来集中讲解。下面分别总结这几种设计模式。

设计模式

GoF的描述

优点或缺点

Singleton单件模式

保证一个类仅有一个实例,并提供一个该实例全局的访问点

可以保证唯一实例;允许在需要时拥有可变数目的实例

Abstract Factory抽象工厂模式

提供一个接口,让该接口负责创建一系列相关或者相互依赖的对象,无需指定他们的具体类

分离了具体的类;可以生产一系列的相关对象,有利于产品的一致性;缺点是难以支持新种类的产品

Builder生成器模式

将一个复杂对象的构建与其表示向分离,使得同样的构建过程可以创建不同的表示

可以使你改变一个产品的内部表示;将构造过程和表示分开;可以对构造过程进行更精细的控制

Factory Method工厂方法模式

定义一个用于创建对象的接口,让子类决定实例化那个类。FactoryMethod使得一个类的实例化延迟到子类

为子类提供了挂钩以提供对象的扩展版本,也就是说子类可以覆盖工厂方法改变创造的产品实例

Prototype原形模式

使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象

改变值获得新的对象;可以在运行时刻指定要实例化的类,例如某个对象设置了若干属性之后,我们需要N这种设置了相同属性的对象,那么可以通过该模式,在动态运行时直接拷贝来生成

这里容易混淆的是Abstract Factory模式和Builder模式,Factory Method模式和Prototype模式也不好区分。Singleton模式没什么太大的困难。下面就来分析一下前四种模式。

一、Abstract Factory模式和Builder模式:

Abstract Factory是应对一系列对象的创建的问题,对于创建一个汽车对象来说,Abstract Factory模式更关注一系列的对象的创建,如:WheelEngineBody等等类型的创建, 这里的一系列可以这样理解,宝马汽车需要宝马的Wheel,宝马的Engine,宝马的Body等等一系列配套的东西,而保时捷汽车则需要保时捷的Wheel,保时捷的Engine等等和保时捷配套的东西。大家注意这换句话说关注点在这一系列对象上,同时它关注创建对象得到的结果

Builder则是将复杂对象的构建过程与它的表示相分离,使得不同的表示可以使用同样的构建过程。这里我们要注意红色的部分,即构建过程与表示相分离,我们可以如此理解,也就是说将结果与对象创建过程进行分离,这里关注点是过程。Builder模式注重的对象生产的过程,也就是如何一步一步将需要的对象构建起来的,同样对于一个汽车对象来举例,我们需要首先创建Wheel,再创建Engine,再创建Body,然后将他们进行组装,得到想要的汽车对象,可以看到,Builder模式将构建的组装的过程进行了隐藏和封装。而Abstract Factory则只是一系列对象的工厂,组装可能还是需要客户自己来完成。

二、Factory Method模式和Prototype模式:

这两个模式区别比较简单,可以这样理解,Factory Method模式是重新创建一个对象;Prototype模式是利用现有的对象进行克隆,当两个对象或多个对象雷同的时候,可以考虑用一个已创建的对象去克隆出其余的对象。

Abstract Factory一般是利用Factory Method模式来完成一系列对象中的单个对象的创建。

未完待续

分享到:
评论

相关推荐

    设计模式精解-GoF 23种设计模式解析附C++实现源码

    写完了Interpreter模式之后,我习惯性的看看下一天的安排,却陡然发现GoF的23个设计模式的解析已经在我不经意间写完了。就像在一年前看GoF的《设计模式》一书,和半年前用C++模拟、实现23种经典的设计模式一般,透过...

    设计模式实训教程代码

    第三部分对各种相关联的设计模式进行了深入分析和比较,旨在阐明各种设计模式比较理想的应用场景和它们之间的区别;第四部分探讨了设计模式的混编,讲解了如何在实际开发中将各种设计模式混合起来使用,以发挥设计...

    小D深入浅出设计模式+框架源码剖析实战

    ├─第一章 旭瑶-小滴架构师成长系列软件设计模式课程介绍 │ 1.2设计模式全家桶课程大纲速览.mp4 │  ├─第二章 想成为架构师的你,不可不知道的设计模式精髓 │ 2.1设计模式的六大原则你知道多少.mp4 │ 2.3...

    javascript DOM高级程序设计 及 javascript 设计模式

    接下来两本书的顺序已经无关紧要了,《JavaScript DOM高级程序设计》(注意和《JavaScript 高级程序设计》相区别)和《JavaScript设计模式》,这两本都是重量级的书,能让你的JS技术上一个新的台阶;这两本书前者主...

    GoF 23种设计模式解析(附C++实现源码)

    然而学习设计模式的过程却是痛苦的,从 阅读设计模式的圣经——GoF 的《设计模式:可复用面向对象软件的基础》时的枯燥、苦闷、 茫无头绪,到有一天突然有一种顿悟;自己去实现 GoF 的 23 中模式时候的知其然不知其所 ...

    First Head Java+First Head 设计模式

    《Head First Java》是本完整的面向对象(object-oriented,OO)程序设计和Java的学习指导。此书是根据学习理论所设计的,让...在这些活动中,你会写出一堆真正的Java程序,包括了一个船舰炮战游戏和一个网络聊天程序。

    网络编程、常用设计模式

    详细的jsp网络编程、常用设计模式! 前言 3 第一部分:网络编程 4 一、了解URL 4 二、读取URL中的资源 4 1、URL构造方法: 5 2、读取资源 5 三、INETADDRESS类 5 四、SOCKET类 6 1、Socket套接字连接 6 2、Socket...

    设计模式(JAVA语言实现)--20种设计模式附带源码PPT模板.pptx

    5代理模式:类似装饰器模式,区别在于类的构造代理模式:类似装饰器模式,区别在于类的构造 设计模式(JAVA语言实现)--20种设计模式附带源码PPT模板全文共22页,当前为第6页。 logo 6外观模式:没有接口,类单独...

    设计模式之工厂

    三种设计模式:简单工厂/工厂方法/抽象工厂,通过一个教研室购买电脑的例子来进行讲述区别和联系,可以参考我的博客进行阅读。谢谢你的指正。

    Head.First.设计模式中文版pdf(第二部分/共七部分)

    还有模式告白节目,将设计模式拟人化成节目来宾,畅谈其内在的一切。 本书大量采用uML的class Diagram(Static Structure Diagram)。 书中的例子程序虽然都是用JaVa编写,但是本书所介绍的内容对于任何00语言的用户都...

    构架、框架、设计模式之间的关系简述

    一个IT程序员必须知道--构架、框架、设计模式之间的关系简述...

    java设计模式-迭代器模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段...

    二十三种设计模式【PDF版】

    GoF 的设计模式表面上好象也是一种具体的"技术",而且新的设计模式不断在出现,设计模式自有其自己的发展轨道,而这 些好象和 J2EE .Net 等技术也无关! 实际上,GoF 的设计模式并不是一种具体"技术",它讲述的是...

    Python算法与设计模式面试题汇总!.docx

    Python算法与设计模式面试题汇总!全文共4页,当前为第1页。Python算法与设计模式面试题汇总!全文共4页,当前为第1页。Python算法与设计模式面试题汇总! Python算法与设计模式面试题汇总!全文共4页,当前为第1页...

    C#设计模式结构型

    C#设计模式-结构型相关课件 合成模式(Composite) • 设计方案一: 合成模式(Composite) • 设计方案二 合成模式(Composite) • 设计方案一和设计方案二的区别 – 设计方案二使得客户端更不需要关心所需处理的...

    代理设计模式资源

    代理模式应该是做 iOS 开发过程中每个人都用到过的设计模式,以至于用得太普遍而分不清代理和协议之间的差异。本课程将会向大家讲解代理模式、代理与协议的区别以及用抽象基类 NSProxy 实现代理模式。

    设计模式——MVC模式

    Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。 View(视图) - 视图代表模型包含的数据的可视化。 Controller(控制器) - 控制器作用于模型和视图上。它...

    适配器模式和代理模式的区别

    (设计模式的说法源自《设计模式》一书,原名《Design Patterns: Elements of Reusable Object-Oriented Software》。1995年出版,出版社:Addison Wesly Longman.Inc。该书提出了23种基本设计模式,第一次将设计...

Global site tag (gtag.js) - Google Analytics