设计模式的实际应用

摘录一些设计模式的要点,原博主有精细的分类说明,推荐大家去学习一下,地址:http://www.cnblogs.com/jqbird/tag/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/

1).抽象工厂模式(Abstract factory):

原理:

抽象工厂模式的一个主要目的是把所生成的具体类相分离,这些类的实际名称被隐藏在工厂中,在客户级不必了解。

JDK中的此模式应用:

java.util.Calendar#getInstance()

java.util.Arrays#asList()

java.util.ResourceBundle#getBundle()

java.sql.DriverManager#getConnection()

java.sql.Connection#createStatement()

java.sql.Statement#executeQuery()

java.text.NumberFormat#getInstance()

javax.xml.transform.TransformerFactory#newInstance()

应用场合:

1.一个系统要独立于它的产品的创建、组合和表示时。

2.一个系统要由多个产品系列中的一个来配置时。

3.当你强调一系列相关的产品对象的设计以便进行联合使用时。

4.当你提供一个产品类库,而只想显示他们的接口而不是实现时。

2).建造者/生成器模式 (Builder):

原理:

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

主要用来简化一个复杂的对象的创建。

JDK中的此模式应用:

java.lang.StringBuilder#append()

java.lang.StringBuffer#append()

java.sql.PreparedStatement

javax.swing.GroupLayout.Group#addComponent()

应用场合:

1.当创建复杂对象的算法应该独立于该对象的组成部分及他们的装配方式时。

2.当构造过程必须允许被构造的对象有不同的表示时。

3).工厂方法模式 (Factory Method):

原理:

工厂方法通过一个抽象类实现了所有对产品的加工操作代码,唯独将产品的构建方法写成抽象方法。

继承这个抽象类的具体类只重写其构建方法,这样就实现了对于不同被构建产品复用相同的加工操作逻辑

简单来说,按照需求返回一个类型的实例。

JDK中的此模式应用:

java.lang.Proxy#newProxyInstance()

java.lang.Object#toString()

java.lang.Class#newInstance()

java.lang.reflect.Array#newInstance()

java.lang.reflect.Constructor#newInstance()

java.lang.Boolean#valueOf(String)

java.lang.Class#forName()

应用场合:

需要在子类中才能决定实例化哪个被操作对象,同时这些被操作对象又复用相同操作逻辑的场合。

4). 原型模式 (Prototype):

原理:

使用自己的实例创建另一个实例。有时候,创建一个实例然后再把已有实例的值拷贝过去,是一个很复杂的动作。

所以,使用这个模式可以避免这样的复杂性。

JDK中的此模式应用:

java.lang.Object#clone()

java.lang.Cloneable

应用场合:

1.当一个系统应该独立于它的产品创建、构成和表示时。

2、当要实例化的类是在运行时刻指定时,例如通过动态装载。

3、为了避免创建一个与产品类层次平行的工厂类层次时。

4、当一个类的实例只能有几个不同状态组合中的一种时。

5).单例模式 (Singleton):

原理:

保证一个类仅有一个实例,并提供一个访问它的全局访问点。通常我们可以让一个全局变量使得一个对象被访问,但他不能防止你实例化多个对象,一个最好的办法就是,让这个类自身保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问改实例的方法。

JDK中的此模式应用:

java.lang.Runtime#getRuntime()

java.awt.Toolkit#getDefaultToolkit()

java.awt.GraphicsEnvironment#getLocalGraphicsEnvironment()

java.awt.Desktop#getDesktop()

应用场合:

1.当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。

2.当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。

6).适配器模式 (Adapter):

原理:

将一个类的接口转换成用户希望的另一个接口,使原本由于接口不兼容而不能一起工作的那些类可以一起工作。

JDK中的此模式应用:

java.util.Arrays#asList()

javax.swing.JTable(TableModel)

java.io.InputStreamReader(InputStream)

java.io.OutputStreamWriter(OutputStream)

javax.xml.bind.annotation.adapters.XmlAdapter#marshal()

javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal()

应用场合:

1.你想使用一个已经存在的类,而它的接口不符合你的要求。

2.你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。

3.(仅适用于对象adapter),你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配他们的接口。对象适配器可以适配它的父类接口

7).桥接模式 (Bridge):

原理:

把抽象和实现解藕,于是接口和实现可在完全独立开来。

JDK中的此模式应用:

AWT (提供了抽象层映射于实际的操作系统)

JDBC

应用场合:

1.你不希望在抽象和它的实现部分有一个固定的绑定关系。例如这种情况可能是因为程序在运行时刻部分应用可以被选择或者切换。

2.类的抽象以及它的实现都可以通过生成子类的方法加以扩充。

3.对一个抽象的实现部分的修改应对客户不产生影响,即客户端的代码不必重新编译。

4.你想在多个对象之间共享实现,但是同时要求客户并不知道这一点

8).组合模式 (Composite):

原理:

将对象组合成树形结构以表示"部分-整体"的层次结构。"Composite"使得用户对单个对象和组合对象的使用具有一致性。

JDK中的此模式应用:

javax.swing.JComponent#add(Component)

java.awt.Container#add(Component)

java.util.Map#putAll(Map)

java.util.List#addAll(Collection)

java.util.Set#addAll(Collection)

应用场合:

1.你想用部分-整体结构层次。

2.你希望用户忽略组合对象与单个对象的不同,用户将统一的使用组合结构中的所有对象。

9).装饰模式 (Decorator):

原理:

动态地给一个对象添加一些额外的职责,比单纯的继承更为灵活合理.

JDK中的此模式应用:

java.io.BufferedInputStream(InputStream)

java.io.DataInputStream(InputStream)

java.io.BufferedOutputStream(OutputStream)

java.util.zip.ZipOutputStream(OutputStream)

java.util.Collections#checked[List|Map|Set|SortedSet|SortedMap]()

应用场合:

比如java的System.IO各种输出就是通过装饰模式来实现的,还有一些日志类,动态的添加日志记录的功能,将耦合度降到最低。

10).外观模式 (Facade):

原理:

为子系统的一组接口提供一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用

JDK中的此模式应用:

java.lang.Class

javax.faces.webapp.FacesServlet

应用场合:

1.当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用都会产生更   多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子类的的用户带来一些   使用上的困难。Facade可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制     性的用户可以越过Facade层。

2.客户端程序与抽象类的实现部分存在着很大的依赖性。引入Facade将这个子系统与客户以及其他的子系统分离,可以提   高子系统的独立性和可移植性。

3.当你需要构建一个层次结构的子系统时,使用Facade模式定义子系统的每层的入口点。如果子系统之间是相互依赖的,   你可以让他们仅通过facade进行通讯,从而简化了他们之间的依赖关系。

11).享元模式 (Flyweight):

原理:

运用共享技术有效地支持大量细粒度的对象。

JDK中的此模式应用:

java.lang.Integer#valueOf(int)

java.lang.Boolean#valueOf(boolean)

java.lang.Byte#valueOf(byte)

java.lang.Character#valueOf(char)

应用场合:

1.一个应用程序使用了大量的对象。

2.完全由大量的对象,造成很大的存储开销。

3.对象的大多数状态都可变为外部状态。

4.如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。

5.应用程序不依赖于对象标识,由于Flyweight对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值。

12).代理模式 (Proxy):

原理:

为其他对象提供一种代理以控制对这个对象的访问,简单的来说调用这个类的同时其实里面是别的类在干事。

JDK中的此模式应用:

java.lang.reflect.Proxy

RMI

应用场合:

1.远程代理:也就是为一个对象在不同的地址空间提供局部代表,这样可以影藏一个对象存在于不同地址空间的事实,比如.net里的webservice。

2.虚拟代理:根据需要将一个资源消耗很大的或者比较复杂的对象延迟到真正需要时才创建,比如延迟加载图片,优先加载文字

3.保护代理:控制对一个对象的访问权限,用于对象有权限设置的时候

4.智能引用:当调用真实对象时,代理处额外的事情来,提供额外的服务,如计算对象真实的引用次数,这样对象没有引用时可以自动释放它,通过代理访问一个对象时做一些额外的内务处理。

13).职责链模式 (Chain of responsibility):

原理:

使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链。

并沿着这条链传递该请求,直到有一个对象处理它为止。在这个链上的所有的对象有相同的接口(抽象类)但却有不同的实现。

JDK中的此模式应用:

java.util.logging.Logger#log()

javax.servlet.Filter#doFilter()

应用场合:

1.有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。

2.你想在不明确指定接受者的情况下,向多个对象中的一个提交请求。

3.处理一个请求的对象集合应被动态指定。

14).命令模式 (Command):

原理:

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

JDK中的此模式应用:

java.lang.Runnable

javax.swing.Action

应用场合:

1.抽象出待执行的动作以参数化某对象。

2.在不同的时刻指定、排列和执行请求。

3.支持取消操作。

4.支持修改日志,这样当系统崩溃时,这些修改可以被重做一遍。

5.用构建在原语操作上的高层操作构造一个系统。

15).解释器模式 (Interpreter):

原理:

一个语法解释器的模式。

JDK中的此模式应用:

java.util.Pattern

java.text.Normalizer

java.text.Format

应用场合:

当一个语言需要解释执行,并且你可以将该语句中的句子表示为一个抽象语法树时,可使用解释器模式。而当存在以下情况时该模式效果最好。

1.该文法简单对于复杂的文法,文法的类层次变得庞大而无法管理。

2.效率不是一个关键问题,最高效的解释器通常不是通过直接解析语法分析树实现的,而是首先将他们转换成另一种形式。

16).迭代器模式 (Iterator):

原理:

提供一种一致的方法来顺序遍历一个容器中的所有元素。

JDK中的此模式应用:

java.util.Iterator

java.util.Enumeration

应用场合:

1.访问一个聚合对象的内容而无需暴露它的内部表示。

2.支持对聚合对象的多种遍历。

3.为遍历不同的聚合结构提供一个统一的接口(即,多态迭代)。

17).中介者模式 (Mediator):

原理:

用中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以对立地改变他们之间的交互。用来减少对象单的直接通讯的依赖关系。使用一个中间类来管理消息的方向。

JDK中的此模式应用:

java.util.Timer

java.util.concurrent.Executor#execute()

java.util.concurrent.ExecutorService#submit()

java.lang.reflect.Method#invoke()

应用场合:

1.一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。

2.一个对象引用很多其他对象并直接与这些对象通信,导致难以复用该对象。

3.想定制一个分部在多个类中的行为,而又不想生成太多的子类。

18).备忘录模式 (Memento):

原理:

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态。给一个对象的状态做一个快照。Date类在内部使用了一个long型来做这个快照。

JDK中的此模式应用:

java.util.Date

java.io.Serializable

应用场合:

1.必须保存一个对象在某一时刻(部分)的状态,这样以后需要时它才能恢复到先前的状态。

2.如果用一个接口来让其他对象直接得到这个状态,将会暴露对象的实现细节并破坏对象的封装性。

19).观察者模式 (Observer):

原理:

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。

JDK中的此模式应用:

java.util.EventListener

javax.servlet.http.HttpSessionBindingListener

javax.servlet.http.HttpSessionAttributeListener

javax.faces.event.PhaseListener

应用场合:

1.当一个对象有两个方面,其中一个方面依赖于另一个方面。将二者封装在独立的对象中以使他们可以各自独立的改变和复用。

2.当一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变。

3.当一个对象必须通知其他对象,而又不能假定其他对象是谁。

20).状态模式 (State):

原理:

这个模式允许你可以在运行时很容易地根据自身内部的状态改变对象的行为。

JDK中的此模式应用:

java.util.Iterator

javax.faces.lifecycle.LifeCycle#execute()

应用场合:

1.当一个对象的转换条件表达式过于复杂时,通常这个状态由一个或者多个枚举表示,通常有多个操作包含这一相同的的条件结构,state模式将一个条件分支放到一个类中,这使得你可以根据对象自身的情况将对象的状态作为对象,这一对象不依赖于其他对象而独立变化,把状态的判断逻辑放到表示不同状态的一系列类中。

2.一个对象的行为取决于它的状态,并且它必须在运行时根据状态立即改变行为。

21).策略模式 (Strategy):

原理:

定义一组算法,并把其封装到一个对象中。然后在运行时,可以灵活的使用其中的一个算法。

JDK中的此模式应用:

java.util.Comparator#compare()

javax.servlet.http.HttpServlet

javax.servlet.Filter#doFilter()

应用场合:

1.多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。

2.需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。

3.对客户隐藏具体策略(算法)的实现细节,彼此完全独立。

22).模板方法模式 (Template method):

原理:

使得子类可以不改变一个算法的结构即可以重定义该算法的某些特定步骤

换种说法:允许子类重载部分父类而不需要完全重写。

JDK中的此模式应用:

java.util.Collections#sort()

java.io.InputStream#skip()

java.io.InputStream#read()

java.util.AbstractList#indexOf()

应用场合:

1.一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。

2.各子类中公共的行为应被提取出来并集中到一个公共类中以避免代码重复。

首先识别现有代码的不同之处,并且将不同之处分离为新的操作。

最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。

3.控制子类的扩展

23).访问者模式 (Visitor):

原理:

作用于某个对象群中各个对象的操作. 它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作.

JDK中的此模式应用:

javax.lang.model.element.Element 和javax.lang.model.element.ElementVisitor

javax.lang.model.type.TypeMirror 和javax.lang.model.type.TypeVisitor

应用场合:

1.一个对象结构包含很多类对象,他们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作。

2.需要对一个对象中的对象进行很多不同的并且不相关的操作,而你想避免让这些操作‘污染’这些对象的类。

visitor使得你可以将相关的操作集中起来定义在一个类中。

当该对象结构被很多应用共享时,使用Visitor模式让每个应用包含需要用到的操作。

3.定义对象结构类很少改变,但经常需要在此结构上定义新的操作。

改变对象结构类需要重定义对所有访问者的接口,这可能需要很大的代价。

如果对象结构类经常改变,那么可能还是在这些类中定义这些操作较好。

时间: 2024-10-09 09:15:18

设计模式的实际应用的相关文章

Java设计模式——创建型模式之单例模式

一.概述 作为第一个出场的设计模式,有必要先介绍一下设计模式(引用自百度百科): 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结. 使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性. 设计模式使代码编写真正工程化:设计模式是软件工程的基石脉络,如同大厦的结构一样. 设计模式概念的介绍,参见:http://blog.jobbole.com/101076/ 其中涉及的设计原则的概念,参见随笔:http://www.c

10大APP界面框架设计模式详解

随着移动互联网的发展,移动app已经成为了每个互联网公司的标配了,那作为产品经理,我们如何设计出更加符合用户体验的app产品呢?今天和大家分享的就是10中最常见的app界面光甲设计模式,一起来看看吧. 1.标签导航 标签导航是十大界面框架设计里最常用的界面框架设计,也是被业界之内公认的一种普遍使用的页面框架设计.那么这种页面框架设计在作业方面对一个用户来说也是最常见的一种页面框架设计,比如说微博.微信.手机百度.支付宝.淘宝,这些我们所谓的超级APP都是运用的标签导航,无一例外.从这个角度也可以

[js高手之路]设计模式系列课程-组合模式+寄生组合继承实战新闻列表

所谓组合模式,就是把一堆结构分解出来,组成在一起,现实中很多这样的例子,如: 1.肯德基套餐就是一种组合模式, 比如鸡腿堡套餐,一般是是由一个鸡腿堡,一包薯条,一杯可乐等组成的 2.组装的台式机同理,由主板,电源,内存条,显卡, 机箱,显示器,外设等组成的 把一个成型的产品组成部件,分成一个个独立的部件,这种方式可以做出很多灵活的产品,这就是组合模式的优势 比如:家用台式机电脑,要求配置比较低, 这个时候只需要主板+电源+内存条+机箱+显示器+外设就可以了,不需要配置独立显卡 鸡腿堡+鸡翅+紫薯

Happy 设计模式之适配器模式(JAVA)

设计模式-适配器模式 适配器模式定义 适配器模式,将一个类的的接口转换成客户或者产品希望的接口形式,就是原本不兼容或者甚至不相干的接口不能一起工作的接口一起工作,完成需求或者客户的需求. 适配器模式的使用场景 1.当你使用一个已经存在的类,而他的接口不符合你的需求. 2.你想要创建一个复用的类,该类可以与其相关的类或者不可见的类协同工作. 适配器角色 Target:目标接口 TargetImpl:目标实现类 Adapter:适配器 Adaptee:被适配者 代码解析: package com.d

设计模式 2/23 工厂模式

工厂模式是最常用的设计模式之一,用好了,代码优雅,可维护性高,对系统设计会上一个台阶 为什么这么说,因为工厂模式可以牵扯出抽象工厂模式,也有大家都会聊到的简单工厂模式 我们要了解一点,23中设计模式中,不包含简单工厂模式,之所以大家会去聊这个,四个字,渐进明细 通过对简单工厂模式的了解,我们引入工厂这个词,不然一个写代码的,天天给他讲工厂,工厂,工厂,西厂,东厂,会晕 同时,通过逐步的深入,从简单工厂,到工厂模式,再到抽象工厂,渐进明细的过程,逐步深入的理解,比较优劣,择优而为我们所用. 试想我

Java设计模式学习笔记,一:单例模式

开始学习Java的设计模式,因为做了很多年C语言,所以语言基础的学习很快,但是面向过程向面向对象的编程思想的转变还是需要耗费很多的代码量的.所有希望通过设计模式的学习,能更深入的学习. 把学习过程中的笔记,记录下来,只记干货. 第一部分:单例模式的内容 单例模式:类只能有一个实例. 类的特点:1.私有构造器:2.内部构造实例对象:3.对外提供获取唯一实例的public方法. 常见的单例模式实现有五种形式: 1.饿汉式. 2.懒汉式. 3.双重检查锁式. 4.静态内部类式. 5.枚举式. 以下分别

设计模式之单列模式

设计模式之单列模式 1,何为单列模式? 即singleton 在某个类采用了单列模式之后  其只能有一个实列对象 ,并且这个实列对象只能有内部自己创建并提供给外部的调用. 2.实现单列模式的方法 分为 :饿汉式 ,懒汉式 下面为饿汉式实现代码: public calss Singleton1{ //将构造函数私有化 防止外部通过new来创建对象 private Singleton1(){ } //创建一个私有静态变量并直接初始化 类加载的时候直接创建对象 private static Singl

设计模式之原型模式(Prototype)

1.初识原型模式 大家都知道连锁机构是现在灰常流行的商业模式,比如咖啡之翼,那么假设咖啡之翼要在长春新建立一个分店,所经营的产品和以前在其他的城市已经存在的店经营的产品差不多,那么面向对象开发的角度怎么解决这个问题呢?难道要重新的实例化一个咖啡之翼的店??这显然不太好吧,咖啡之翼里面经营的产品(假设是属性吧)都需要重新写,这就是在做大量的重复工作啊,这显然是不符合OO开发思想的.遇到这样的情况,并不是重新建立一个类来解决这样的问题,而是通过设计模式中的"原型模式"来解决这种问题.是这种

对设计模式的总结之简单工厂与策略模式

前言 面向对象编程追求的本质-提高扩展性.可维护性.灵活性和复用性.合理利用面向对象6个原则,能够很好的达到要求.如何利用好就是至关重要的了,前人总结了23+个设计模式能够让初学者更容易学到其中的精髓,本文就说说我对本人对简单工厂模式.策略模式的见解. 简单工厂模式与策略模式 简单工厂模式 工作中,常常遇到需要做一个功能(鸭子),这个功能中含有可控个数的子操作功能(鸭子叫,鸭子跑,鸭子飞),而且子功能在不同的情况下处理方式又不相同(成年鸭子/小鸭子叫,成年鸭子/小鸭子跑,成年鸭子/小鸭子飞).我

设计模式——介绍与工厂模式(扁平管理模式VS职业经理人模式)

本文主要对设计模式进行大概解说.特别是对工厂模式进行简明的解析: 一.设计模式的分类 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.訪问者模式.中介者模式.解释器模式. 事实上还有两类:并发型模式和线程池模式. 二.设计模式的六大原则 1.开闭原则(Op