当前位置:  开发笔记 > 编程语言 > 正文

Java核心库中的GoF设计模式示例

如何解决《Java核心库中的GoF设计模式示例》经验,为你挑选了7个好方法。

我正在学习GoF Java设计模式,我想看看它们的一些真实例子.Java核心库中这些设计模式的一些很好的例子是什么?



1> BalusC..:

您可以在维基百科中找到许多设计模式的概述.它还提到了GoF提到的模式.我将在这里总结它们并尝试在Java SE和Java EE API中分配尽可能多的模式实现.


创作模式

抽象工厂 (可通过创建方法识别返回工厂本身,而工厂本身又可用于创建另一个抽象/接口类型)

javax.xml.parsers.DocumentBuilderFactory#newInstance()

javax.xml.transform.TransformerFactory#newInstance()

javax.xml.xpath.XPathFactory#newInstance()

构建器 (通过创建方法返回实例本身可识别)

java.lang.StringBuilder#append() (非同步)

java.lang.StringBuffer#append() (同步)

java.nio.ByteBuffer#put()(还CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBufferDoubleBuffer)

javax.swing.GroupLayout.Group#addComponent()

所有的实现 java.lang.Appendable

java.util.stream.Stream.Builder

工厂方法 (通过创建方法可识别返回抽象/接口类型的实现)

java.util.Calendar#getInstance()

java.util.ResourceBundle#getBundle()

java.text.NumberFormat#getInstance()

java.nio.charset.Charset#forName()

java.net.URLStreamHandlerFactory#createURLStreamHandler(String) (按协议返回单个对象)

java.util.EnumSet#of()

javax.xml.bind.JAXBContext#createMarshaller() 和其他类似的方法

原型 (可通过创建方法识别,返回具有相同属性的自身的不同实例)

java.lang.Object#clone()(班级必须实施java.lang.Cloneable)

Singleton (可通过创建方法识别每次返回相同的实例(通常是自身))

java.lang.Runtime#getRuntime()

java.awt.Desktop#getDesktop()

java.lang.System#getSecurityManager()


结构模式

适配器 (通过创建方法识别,采用不同的抽象/接口类型的实例,并返回自己的/另一个抽象/接口类型的实现,它修饰/覆盖给定的实例)

java.util.Arrays#asList()

java.util.Collections#list()

java.util.Collections#enumeration()

java.io.InputStreamReader(InputStream)(返回Reader)

java.io.OutputStreamWriter(OutputStream)(返回Writer)

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

Bridge (可通过创建方法识别,采用不同的抽象/接口类型的实例并返回委托/使用给定实例的自己的抽象/接口类型的实现)

没有想到的.一个虚构的例子是new LinkedHashMap(LinkedHashSet, List)返回一个不可修改的链接映射,它不会克隆项目,而是使用它们.然而java.util.Collections#newSetFromMap(),singletonXXX()方法和方法很接近.

复合 (通过将相同的抽象/接口类型的实例转换为树结构的行为方法可识别)

java.awt.Container#add(Component) (几乎所有的Swing因此)

javax.faces.component.UIComponent#getChildren() (几乎遍布JSF UI)

Decorator (recognizeable by creational methods taking an instance of same abstract/interface type which adds additional behaviour)

All subclasses of java.io.InputStream, OutputStream, Reader and Writer have a constructor taking an instance of same type.

java.util.Collections, the checkedXXX(), synchronizedXXX() and unmodifiableXXX() methods.

javax.servlet.http.HttpServletRequestWrapper and HttpServletResponseWrapper

javax.swing.JScrollPane

Facade (recognizeable by behavioral methods which internally uses instances of different independent abstract/interface types)

javax.faces.context.FacesContext, it internally uses among others the abstract/interface types LifeCycle, ViewHandler, NavigationHandler and many more without that the enduser has to worry about it (which are however overrideable by injection).

javax.faces.context.ExternalContext, which internally uses ServletContext, HttpSession, HttpServletRequest, HttpServletResponse, etc.

Flyweight (recognizeable by creational methods returning a cached instance, a bit the "multiton" idea)

java.lang.Integer#valueOf(int) (also on Boolean, Byte, Character, Short, Long and BigDecimal)

Proxy (recognizeable by creational methods which returns an implementation of given abstract/interface type which in turn delegates/uses a different implementation of given abstract/interface type)

java.lang.reflect.Proxy

java.rmi.*

javax.ejb.EJB (explanation here)

javax.inject.Inject (explanation here)

javax.persistence.PersistenceContext


Behavioral patterns

Chain of responsibility (recognizeable by behavioral methods which (indirectly) invokes the same method in another implementation of same abstract/interface type in a queue)

java.util.logging.Logger#log()

javax.servlet.Filter#doFilter()

Command (recognizeable by behavioral methods in an abstract/interface type which invokes a method in an implementation of a different abstract/interface type which has been encapsulated by the command implementation during its creation)

All implementations of java.lang.Runnable

All implementations of javax.swing.Action

Interpreter (recognizeable by behavioral methods returning a structurally different instance/type of the given instance/type; note that parsing/formatting is not part of the pattern, determining the pattern and how to apply it is)

java.util.Pattern

java.text.Normalizer

All subclasses of java.text.Format

All subclasses of javax.el.ELResolver

Iterator (recognizeable by behavioral methods sequentially returning instances of a different type from a queue)

All implementations of java.util.Iterator (thus among others also java.util.Scanner!).

All implementations of java.util.Enumeration

Mediator (recognizeable by behavioral methods taking an instance of different abstract/interface type (usually using the command pattern) which delegates/uses the given instance)

java.util.Timer (all scheduleXXX() methods)

java.util.concurrent.Executor#execute()

java.util.concurrent.ExecutorService (the invokeXXX() and submit() methods)

java.util.concurrent.ScheduledExecutorService (all scheduleXXX() methods)

java.lang.reflect.Method#invoke()

Memento (recognizeable by behavioral methods which internally changes the state of the whole instance)

java.util.Date (the setter methods do that, Date is internally represented by a long value)

All implementations of java.io.Serializable

All implementations of javax.faces.component.StateHolder

Observer (or Publish/Subscribe) (recognizeable by behavioral methods which invokes a method on an instance of another abstract/interface type, depending on own state)

java.util.Observer/java.util.Observable (rarely used in real world though)

All implementations of java.util.EventListener (practically all over Swing thus)

javax.servlet.http.HttpSessionBindingListener

javax.servlet.http.HttpSessionAttributeListener

javax.faces.event.PhaseListener

State (recognizeable by behavioral methods wh


@BalusC,我有一个问题要问你.您是否阅读过Java和JSF的**WHOLE**源代码?
令人印象深刻.. :) +1.`javax.lang.model.element`定义了访问者;)我不太确定`doXXX`和`doFilter`是否是"策略".
@Tapas:我没有阅读所有内容,只阅读了我需要的部分,或者只是对"他们"如何做到这一点感到好奇.
所提到的构建器,例如StrinbgBuilder,都不是Builder-Pattern的一个例子.然而,将它们视为构建者是一个非常常见的错误(所以你不应该责怪^ _ ^)
@BalusC:Object.toString()几乎不能被认为是工厂方法; 阶级关系是正确的,但意图是错误的.当然很难画线,但任何创建和返回另一个对象的方法都不能称为工厂方法.也许你可以说toString的目的不是创建一个字符串而是关于接收者的返回信息,因此它不是工厂方法.
这篇相关的博客文章刚刚出现http://www.briandupreez.net/2010/11/design-patterns-in-jdk.html
"工厂方法"下的大多数示例都是"静态工厂"的示例,它不是GoF模式.不正确.
@Bozho:谢谢您的访客示例!(顺便说一句,整个API对我来说实际上是新的)。在`doXXX()`和`doFilter()`中,您基本上只编写了策略算法。服务器加载并执行它。
适配器示例太浅.我希望清楚地看到一个适配器接口如何支持不同的适配器接口,但是从示例中并不明显.
@BalusC在[Singleton设计模式](http://en.wikipedia.org/wiki/Singleton_pattern)中,`getInstance()`是返回单例的方法的名称,在我目前读过的所有书中(包括我指的维基百科页面.我发现JDK实际上并没有在名为`getInstance()`的方法上返回单例,这让我很困惑

2> jitter..:

    整个摆动的观察者模式(Observable,Observer)

    MVC也在摇摆

    适配器模式:InputStreamReader和OutputStreamWriter注:ContainerAdapter,ComponentAdapter,FocusAdapter,KeyAdapter,MouseAdapter适配器; 它们实际上是Null Objects.Sun的命名选择不佳.

    装饰模式(BufferedInputStream可以装饰其他流等FilterInputStream)

    AWT Toolkit和Swing可插入外观类的AbstractFactory Pattern

    java.lang.Runtime#getRuntime() 是辛格尔顿

    ButtonGroup 对于Mediator模式

    Action,AbstractAction可用于不同的可视化表示来执行相同的代码 - >命令模式

    用于Flyweight模式的JTable中的Interned Strings或CellRender(还要考虑各种池 - 线程池,连接池,EJB对象池 - Flyweight实际上是关于共享资源的管理)

    Java 1.0事件模型是责任链的一个示例,Servlet过滤器也是如此.

    集合框架中的迭代器模式

    AWT/Swing中的嵌套容器使用Composite模式

    AWT/Swing中的布局管理器就是战略的一个例子

还有更多我猜



3> NawaMan..:

    Flyweight与Byte,Short,Integer,Long和String的某些值一起使用.

    Facade在很多地方使用,但最明显的是Scripting接口.

    Singleton - java.lang.Runtime浮现在脑海中.

    抽象工厂 - 还有脚本和JDBC API.

    命令 - TextComponent的撤消/重做.

    解释器 - RegEx(java.util.regex.)和SQL(java.sql.)API.

    原型 - 不是100%肯定如果这个计数,但我认为clone()方法可以用于此目的.



4> duffymo..:

RMI基于代理.

对于GoF中的23种模式中的大多数,应该可以引用一种:

    抽象工厂:java.sql接口在注册驱动程序时从JDBC JAR获取具体实现.

    Builder:java.lang.StringBuilder.

    工厂方法:XML工厂等.

    原型:也许克隆(),但我不确定我是买它.

    Singleton:java.lang.System

    适配器:java.awt.event中的适配器类,例如WindowAdapter.

    Bridge:java.util中的集合类.由ArrayList实现的列表.

    复合:java.awt.java.awt.Component + java.awt.Container

    装饰者:遍布java.io包.

    Facade:ExternalContext表现为执行cookie,会话范围和类似操作的外观.

    Flyweight:整数,字符等

    代理:java.rmi包

    责任链:Servlet过滤器

    命令:Swing菜单项

    解释器:不直接在JDK中,但JavaCC肯定使用它.

    Iterator:java.util.Iterator接口; 不能比那更清楚.

    调解员:JMS?

    纪念品:

    观察者:java.util.Observer/Observable(虽然做得不好)

    州:

    战略:

    模板:

    游客:

我不能想到23个中有10个用Java的例子,但我会明白我明天能不能做得更好.这就是编辑的目的.



5> uckelman..:

抽象工厂模式用于各种地方.例如DatagramSocketImplFactory,PreferencesFactory.还有更多---在Javadoc中搜索名称中带有"Factory"字样的接口.

此外,还有很多工厂模式的实例.



6> Esko..:

即使我有一个破坏时钟,Java XML API使用Factory很多.我的意思是看看这个:

Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(source);
String title = XPathFactory.newInstance().newXPath().evaluate("//title", doc);

...等等等等.

另外,各种Buffers(StringBuffer,ByteBuffer,StringBuilder)使用Builder.



7> Catweazle..:

工厂方法

java.util.Collection #teterator是Factory方法的一个很好的例子.根据您使用的Collection的具体子类,它将创建一个Iterator实现.因为Factory超类(Collection)和Iterator都是接口,所以它有时会与AbstractFactory混淆.在接受的答案(BalusC)中,AbstractFactory的大多数示例都是Factory的示例,它是Factory Method的简化版本,它不是原始GoF模式的一部分.在Facory中,工厂类层次结构已折叠,工厂使用其他方法选择要返回的产品.

抽象工厂

抽象工厂有多种工厂方法,每种方法都可以创建不同的产品.一家工厂生产的产品可以一起使用(您的打印机和墨盒最好来自同一个(抽象)工厂).正如上面的答案中所提到的,不同平台的AWT GUI组件系列就是一个例子(虽然它的实现与Gof中描述的结构不同).

推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有