原帖:http://stackoverflow.com/questions/1673841/examples-of-gof-design-patterns

提问:我正在学习GoF的《设计模式》,想了解些它们在实际中的应用的样例。

大家能给我举一些使用设计模式的好样例吗?尤其是在Java类库中。

获得赞同最高的回答:

你能够通过Wikipedia对设计模式有个总体上的理解。Wikipedia上也提高了GoF所涉及到的模式。我这里总结一下,而且尽可能指出在JavaSE与JavaEE的API中是怎样运用这些模式的。

创建型设计模式

抽象工厂模式

特点:创建方法返回一个能够用来创建抽象类或接口的工厂类。

生成器模式

特点:创建方法返回这个实例本身。

工厂方法模式

特点:创建方法返回抽象类或接口的实现。

原型模式

特点:创建方法返回一个同类型且具有同样属性的还有一个实例。

单例模式

特点:创建方法返回同一个实例(不管在何时调用)。

结构型模式

适配器模式

特点:创建方法接受一个与当前类不同的抽象类或接口的实例作为參数,返回一个经过修饰或重写给定參数实例的抽象类或接口的实现。

桥接模式

特点:创建方法接受一个与当前类不同的抽象类或接口的实例作为參数,返回一个经过代理或使用给定參数实例的抽象类或接口的实现。

  • 临时没有想到。一个能够想到的样例是new LinkedHashMap(LinkedHashSet, List)。这种方法返回一个不可改动的linkedMap。它就没有拷贝參数中的元素(item),而是直接使用它们。java.util.Collections#newSetFromMap()和singletonXXX()方法也与之类似。

组合模式

特点:行为方法把同样抽象类或接口的实例转化为一个树结构。

装饰模式

特点:创建方法以一个抽象类或接口的实例为參数。返回值是添加了额外方法的给參数实例。

外观模式

特点:行为方法在内部使用全然不同的抽象类或接口的实例做封装。

享元模式

特点:创建方法返回一个缓存的实例。与多例模式有些类似。

代理模式

特点:创建方法返回一个给定抽象类或接口的实例,这个实例代理或使用了这个给定抽象类或接口的还有一个实现。

恕我直言,Wikipedia上的类子不是非常好,惰性载入实际上和代理模式一点关系也没有。

行为模式

职责链模式

特点:行为方法间接调用队列中同一抽象类或接口的还有一实例的同名方法。

命令模式

特点:一个抽象类或接口中的行为方法调用还有一个在创建时经命令方法包装的抽象类或接口实现的还有一个方法。

解释器模式

特点:行为方法返回结构上不同的抽象类或接口的实例,须要注意的是解析或格式化过程并非这个模式的一部分。而这个过程决定了解释器怎样将要去应用并实施这个变换。

迭代模式

特点:行为方法连续地返回队列中的同样对象的不同实例。

中介者模式

特点:行为方法接受一个不同的抽象类或接口的实例(一般使用命令模式)作为參数,而这个參数同一时候也代理了其他给定抽象类或接口的实例。

备忘模式

特点:行为方法在内部改变整个实例的状态。

观察者(公布/订阅)模式

特点:行为方法依据其自身的状态,去调用还有一个抽象类或接口实例的方法。

状态模式

特点:行为方法依据它可以控制的状态来变自身的行为。

策略模式

特点:在一个抽象类或接口的行为方法会调用作为一种策略实现而通过參数传入的还有一个抽象类或接口实例的方法。

模板方法模式

特点:具有由抽象类型定义默认行为的行为方法。

訪问者模式

特点:由两个不同的抽象类或接口,它们都有接受对方做參数的方法,被调用的方法会去调用还有一个对象的方法,然后依据制定好的策略运行。

參考翻译:

http://www.importnew.com/12526.html

java类库中的设计模式的更多相关文章

  1. 谈谈Java常用类库中的设计模式 - Part Ⅰ

    背景 最近一口气看完了Joshua Bloch大神的Effective Java(下文简称EJ).书中以tips的形式罗列了Java开发中的最佳实践,每个tip都将其意图和要点压缩在了标题里,这种做法 ...

  2. JAVA IO中的设计模式

    在java语言 I/O库的设计中,使用了两个结构模式,即装饰模式和适配器模式.       在任何一种计算机语言中,输入/输出都是一个很重要的部分.与一般的计算机语言相比,java将输入/输出的功能和 ...

  3. 谈谈Java常用类库中的设计模式 - Part Ⅱ

    概述 本系列上一篇:建造者.工厂方法.享元.桥接 本文介绍的设计模式(建议按顺序阅读): 适配器 模板方法 装饰器 相关缩写:EJ - Effective Java Here We Go 适配器 (A ...

  4. java开发中的设计模式

    http://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html 一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五 ...

  5. Java Web中MVC设计模式与IOC

    MVC是由Model(模型).View(视图).Controller(控制器)三个模块组成 视图:用于做数据展示以及和用户交互的一个界面(html页面) 控制层:能够接受客户端的请求,具体的业务功能还 ...

  6. 【Java心得总结六】Java容器中——Collection

    在[Java心得总结五]Java容器上——容器初探这篇博文中,我对Java容器类库从一个整体的偏向于宏观的角度初步认识了Java容器类库.而在这篇博文中,我想着重对容器类库中的Collection容器 ...

  7. JAVA项目中常用的异常处理情况总结

    JAVA项目中常用的异常知识点总结 1. java.lang.nullpointerexception这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用 ...

  8. java类库字符串操作

    在java类库中,java给我们提供了字符串几个特别的操作,分别是String,Stringbuffer,Stringbuilder等.下面就对这几个类做一个简单的介绍.首先,我们先了解一下Strin ...

  9. JAVA项目中常用的异常知识点总结

    JAVA项目中常用的异常知识点总结 1. java.lang.nullpointerexception这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用 ...

随机推荐

  1. zabbix3.4 源码部署

    centos6.8  系统    zabbix3.4.9   msyql5.7.22   php5.6.24  在centos6上面源码部署zabbix.3.4 问题比较多,需要花不少时间去解决,建议 ...

  2. linux系统初体验

    .操作系统的认识和安装 linux 一切皆文件! 对于我们学习以及以后从事运维工作的人儿来说,推荐centos,其他发行版本,万变不离其宗.(试着安装一个系统玩玩) 2.linux 系统基础 2.1. ...

  3. Codeforces Round #393 (Div. 2)

    A. Petr and a calendar time limit per test:2 seconds memory limit per test:256 megabytes input:stand ...

  4. javascript获取querystring值【个人觉得这种方法最好最棒最像.NET】

    原文发布时间为:2009-05-22 -- 来源于本人的百度文章 [由搬家工具导入] JavaScript获取QueryString值, 当没有QueryString值时输出bool型 null 用j ...

  5. [翻译]现代Linux系统上的栈溢出攻击【转】

    转自:http://www.codeweblog.com/%E7%BF%BB%E8%AF%91-%E7%8E%B0%E4%BB%A3linux%E7%B3%BB%E7%BB%9F%E4%B8%8A%E ...

  6. poj 2892(二分+树状数组)

    Tunnel Warfare Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 7749   Accepted: 3195 D ...

  7. ios圆角优化-不掉帧

    因网络图片加载用的是SDWebImage所以下面以sd加载图片为例 //普通的加载网络图片方式(已不能满足需求,需要改进) [self sd_setImageWithURL:url placehold ...

  8. Codeforces Gym100971 F.Two Points (IX Samara Regional Intercollegiate Programming Contest Russia, Samara, March 13)

    这个题直接推公式就可以. 就是解一元二次方程,用高中学的公式,函数开口向上,求最大值为(4ac-b*b)/4a. 这个题推出来一元二次方程,然后将最大值的公式化简一下.公式很好推. 这个题有疑问,in ...

  9. 根据CPU核数合理设置线程池大小

    一般来说池中总线程数是核心池线程数量两倍,只要确保当核心池有线程停止时,核心池外能有线程进入核心池即可. 我们所需要关心的主要是核心池线程的数量该如何设置. 自定义线程池代码 package com. ...

  10. 2016北京集训测试赛(十四)Problem A: 股神小L

    Solution 考虑怎么卖最赚钱: 肯定是只卖不买啊(笑) 虽然说上面的想法很扯淡, 但它确实能给我们提供一种思路, 我们能不买就不买; 要买的时候就买最便宜的. 我们用一个优先队列来维护股票的价格 ...