**这个问题的答案是社区的努力。编辑现有答案以改进此帖子。它目前不接受新的答案或互动。
我正在学习gofjava设计模式,我想看看它们的一些实际例子。java核心库中这些设计模式的一些好例子是什么?
bjp0bcyl1#
你可以在维基百科中找到很多设计模式的概述。它还提到了gof提到的模式。我将在这里总结它们,并尝试分配在javase和javaeeapi中找到的尽可能多的模式实现。
javax.xml.parsers.DocumentBuilderFactory#newInstance()
javax.xml.xpath.XPathFactory#newInstance()
java.lang.StringBuilder#append()
java.lang.StringBuffer#append()
java.nio.ByteBuffer#put()
CharBuffer
ShortBuffer
IntBuffer
LongBuffer
FloatBuffer
DoubleBuffer
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.util.stream.Stream.Builder
java.util.Calendar#getInstance()
java.text.NumberFormat#getInstance()
java.net.URLStreamHandlerFactory#createURLStreamHandler(String)
javax.xml.bind.JAXBContext#createMarshaller()
java.lang.Object#clone()
java.lang.Cloneable
java.lang.Runtime#getRuntime()
java.lang.System#getSecurityManager()
java.util.Arrays#asList() java.util.Collections#list() java.util.Collections#enumeration() java.io.InputStreamReader(InputStream) (返回a) Reader ) java.io.OutputStreamWriter(OutputStream) (返回a) Writer ) javax.xml.bind.annotation.adapters.XmlAdapter#marshal() 以及 #unmarshal() ####桥(可通过创建方法识别,创建方法获取不同抽象/接口类型的示例,并返回委托/使用给定示例的自己的抽象/接口类型的实现)还没想到。一个虚构的例子是 new LinkedHashMap(LinkedHashSet<K>, List<V>) 它返回一个不可修改的链接Map,该Map不克隆项,而是使用它们。这个 java.util.Collections#newSetFromMap() 以及 singletonXXX() 然而,方法却近在咫尺。
java.util.Collections#list()
java.io.InputStreamReader(InputStream)
Reader
java.io.OutputStreamWriter(OutputStream)
Writer
javax.xml.bind.annotation.adapters.XmlAdapter#marshal()
#unmarshal()
new LinkedHashMap(LinkedHashSet<K>, List<V>)
java.util.Collections#newSetFromMap()
singletonXXX()
java.awt.Container#add(Component)
javax.faces.component.UIComponent#getChildren()
的所有子类 java.io.InputStream , OutputStream , Reader 以及 Writer 有一个构造函数获取同一类型的示例。 java.util.Collections ,的 checkedXXX() , synchronizedXXX() 以及 unmodifiableXXX() 方法。 javax.servlet.http.HttpServletRequestWrapper 以及HttpServletResponseWrapper javax.swing.JScrollPane ####facade(可通过行为方法识别,行为方法在内部使用不同独立抽象/接口类型的示例) javax.faces.context.FacesContext ,它在内部使用抽象/接口类型 LifeCycle , ViewHandler , NavigationHandler 如果没有这些,最终用户就不得不担心它(尽管注入可以覆盖它)。 javax.faces.context.ExternalContext ,内部使用 ServletContext , HttpSession , HttpServletRequest , HttpServletResponse 等等。
java.io.InputStream
OutputStream
java.util.Collections
checkedXXX()
synchronizedXXX()
unmodifiableXXX()
javax.servlet.http.HttpServletRequestWrapper
javax.swing.JScrollPane
javax.faces.context.FacesContext
LifeCycle
ViewHandler
NavigationHandler
javax.faces.context.ExternalContext
ServletContext
HttpSession
HttpServletRequest
HttpServletResponse
java.lang.Integer#valueOf(int)
Boolean
Byte
Character
Short
Long
BigDecimal
java.lang.reflect.Proxy
javax.ejb.EJB
javax.inject.Inject
javax.persistence.PersistenceContext
java.util.logging.Logger#log() javax.servlet.Filter#doFilter() ####命令(可由抽象/接口类型中的行为方法识别,该抽象/接口类型调用不同抽象/接口类型实现中的方法,该抽象/接口类型在创建过程中由命令实现封装)的所有实现 java.lang.Runnable 的所有实现 javax.swing.Action ####解释器(可由返回给定示例/类型的结构上不同的示例/类型的行为方法识别;请注意,解析/格式化不是模式的一部分,它决定了模式以及如何应用它)java.util.Pattern java.text.Normalizer 的所有子类 java.text.Format 的所有子类 javax.el.ELResolver ####迭代器(可由从队列中顺序返回不同类型示例的行为方法识别)的所有实现 java.util.Iterator (因此,除其他外 java.util.Scanner !).的所有实现 java.util.Enumeration ####中介(可由行为方法识别,该方法采用不同抽象/接口类型的示例(通常使用命令模式),该示例委托/使用给定示例) java.util.Timer (全部 scheduleXXX() 方法)java.util.concurrent.Executor#execute() java.util.concurrent.ExecutorService (the) invokeXXX() 以及 submit() 方法) java.util.concurrent.ScheduledExecutorService (全部 scheduleXXX() 方法) java.lang.reflect.Method#invoke() ####memento(可通过行为方法识别,行为方法在内部改变整个示例的状态) java.util.Date (setter方法就是这样做的, Date 内部由 long 值)的所有实现 java.io.Serializable 的所有实现 javax.faces.component.StateHolder ####observer(或publish/subscribe)(可由行为方法识别,行为方法根据自身的状态在另一个抽象/接口类型的示例上调用方法) java.util.Observer / java.util.Observable (但在现实世界中很少使用)的所有实现 java.util.EventListener (几乎到处都是) javax.servlet.http.HttpSessionBindingListener javax.servlet.http.HttpSessionAttributeListener javax.faces.event.PhaseListener ####状态(可由行为方法识别,该方法根据可由外部控制的示例状态更改其行为) javax.faces.lifecycle.LifeCycle#execute() (由控制) FacesServlet ,行为取决于jsf生命周期的当前阶段(状态)
javax.servlet.Filter#doFilter()
java.lang.Runnable
javax.swing.Action
java.text.Normalizer
java.text.Format
javax.el.ELResolver
java.util.Iterator
java.util.Scanner
java.util.Enumeration
java.util.Timer
scheduleXXX()
java.util.concurrent.ExecutorService
invokeXXX()
submit()
java.util.concurrent.ScheduledExecutorService
java.lang.reflect.Method#invoke()
java.util.Date
Date
long
java.io.Serializable
javax.faces.component.StateHolder
java.util.Observer
java.util.Observable
java.util.EventListener
javax.servlet.http.HttpSessionBindingListener
javax.faces.event.PhaseListener
javax.faces.lifecycle.LifeCycle#execute()
FacesServlet
java.util.Comparator#compare()
Collections#sort()
javax.servlet.http.HttpServlet
service()
doXXX()
所有非抽象方法 java.io.InputStream , java.io.OutputStream , java.io.Reader 以及 java.io.Writer .所有非抽象方法 java.util.AbstractList , java.util.AbstractSet 以及 java.util.AbstractMap . javax.servlet.http.HttpServlet ,所有 doXXX() 默认情况下,方法向响应发送http 405“method not allowed”错误。你可以自由的实现它们中的任何一个。
java.io.OutputStream
java.io.Reader
java.io.Writer
java.util.AbstractList
java.util.AbstractSet
java.util.AbstractMap
javax.lang.model.element.AnnotationValue
AnnotationValueVisitor javax.lang.model.element.Element 以及ElementVisitor javax.lang.model.type.TypeMirror 以及TypeVisitor java.nio.file.FileVisitor 以及SimpleFileVisitor javax.faces.component.visit.VisitContext 以及 VisitCallback
javax.lang.model.element.Element
javax.lang.model.type.TypeMirror
java.nio.file.FileVisitor
javax.faces.component.visit.VisitContext
VisitCallback
6ojccjat2#
rmi是基于代理的。应该可以引用gof中23种模式中的一种:抽象工厂:当驱动程序注册时,java.sql接口都从jdbcjar获得它们的具体实现。生成器:java.lang.stringbuilder。工厂方法:xml工厂等。原型:可能是clone(),但我不确定我会买这个。单例:java.lang.systemadapter:java.awt.event中的适配器类,例如windowadapter。桥:java.util中的集合类。列表由arraylist实现。c
w7t8yxp53#
整个挥杆过程中的观察者模式( Observable , Observer )mvc也在摇摆适配器模式:inputstreamreader和outputstreamwriter注意: ContainerAdapter , ComponentAdapter , FocusAdapter , KeyAdapter , MouseAdapter 不是适配器;它们实际上是空对象。太阳的命名选择很差。装饰图案( BufferedInputStream 可以装饰其他流,如 FilterInputStream )awt工具包和swing可插拔外观类的abstractfactory模式 java.lang.Runtime#getRuntime() 是辛格尔顿吗 ButtonGroup 对于中介模式 Action , AbstractAction 可以用于不同的视觉表示来执行相同的代码->命令模式jtable for flyweight模式中的interned string或cellrender(还可以考虑各种池—线程池、连接池、ejb对象池—flyweight实际上是关于共享资源的管理)Java1.0事件模型是责任链的一个例子,servlet过滤器也是。集合框架中的迭代器模式awt/swing中的嵌套容器使用复合模式awt/swing中的布局管理器就是策略的一个例子我想还有更多
Observable
Observer
ContainerAdapter
ComponentAdapter
FocusAdapter
KeyAdapter
MouseAdapter
BufferedInputStream
FilterInputStream
ButtonGroup
Action
AbstractAction
um6iljoc4#
flyweight与byte、short、integer、long和string的某些值一起使用。facade在很多地方都有使用,但最明显的是脚本接口。我想到了singleton-java.lang.runtime。抽象工厂-也包括脚本和JDBCAPI。命令-textcomponent的撤消/重做。解释器-regex(java.util.regex.)和sql(java.sql.)api。原型-不是100%确定这算不算,但我想 clone() 方法可用于此目的。
clone()
4条答案
按热度按时间bjp0bcyl1#
你可以在维基百科中找到很多设计模式的概述。它还提到了gof提到的模式。我将在这里总结它们,并尝试分配在javase和javaeeapi中找到的尽可能多的模式实现。
创造模式
抽象工厂(可通过返回工厂本身的创建方法识别,而工厂本身又可用于创建另一个抽象/接口类型)
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
,FloatBuffer
以及DoubleBuffer
)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)
(返回a)Reader
)java.io.OutputStreamWriter(OutputStream)
(返回a)Writer
)javax.xml.bind.annotation.adapters.XmlAdapter#marshal()
以及#unmarshal()
####桥(可通过创建方法识别,创建方法获取不同抽象/接口类型的示例,并返回委托/使用给定示例的自己的抽象/接口类型的实现)还没想到。一个虚构的例子是
new LinkedHashMap(LinkedHashSet<K>, List<V>)
它返回一个不可修改的链接Map,该Map不克隆项,而是使用它们。这个java.util.Collections#newSetFromMap()
以及singletonXXX()
然而,方法却近在咫尺。复合(可通过将同一抽象/接口类型的示例放入树结构的行为方法识别)
java.awt.Container#add(Component)
(几乎到处都是)javax.faces.component.UIComponent#getChildren()
(几乎所有的jsf用户界面都是如此)decorator(可通过使用相同抽象/接口类型的示例并添加额外行为的创建方法识别)
的所有子类
java.io.InputStream
,OutputStream
,Reader
以及Writer
有一个构造函数获取同一类型的示例。java.util.Collections
,的checkedXXX()
,synchronizedXXX()
以及unmodifiableXXX()
方法。javax.servlet.http.HttpServletRequestWrapper
以及HttpServletResponseWrapper
javax.swing.JScrollPane
####facade(可通过行为方法识别,行为方法在内部使用不同独立抽象/接口类型的示例)javax.faces.context.FacesContext
,它在内部使用抽象/接口类型LifeCycle
,ViewHandler
,NavigationHandler
如果没有这些,最终用户就不得不担心它(尽管注入可以覆盖它)。javax.faces.context.ExternalContext
,内部使用ServletContext
,HttpSession
,HttpServletRequest
,HttpServletResponse
等等。flyweight(可通过返回缓存示例的创建方法识别,有点像“multiton”的想法)
java.lang.Integer#valueOf(int)
(同时打开Boolean
,Byte
,Character
,Short
,Long
以及BigDecimal
)代理(可由创建方法识别,该方法返回给定抽象/接口类型的实现,该实现反过来委托/使用给定抽象/接口类型的不同实现)
java.lang.reflect.Proxy
java.rmi.*javax.ejb.EJB
(此处解释)javax.inject.Inject
(此处解释)javax.persistence.PersistenceContext
###行为模式责任链(可由行为方法识别,行为方法(间接)在队列中相同抽象/接口类型的另一个实现中调用相同的方法)
java.util.logging.Logger#log()
javax.servlet.Filter#doFilter()
####命令(可由抽象/接口类型中的行为方法识别,该抽象/接口类型调用不同抽象/接口类型实现中的方法,该抽象/接口类型在创建过程中由命令实现封装)的所有实现
java.lang.Runnable
的所有实现javax.swing.Action
####解释器(可由返回给定示例/类型的结构上不同的示例/类型的行为方法识别;请注意,解析/格式化不是模式的一部分,它决定了模式以及如何应用它)java.util.Pattern
java.text.Normalizer
的所有子类java.text.Format
的所有子类javax.el.ELResolver
####迭代器(可由从队列中顺序返回不同类型示例的行为方法识别)的所有实现
java.util.Iterator
(因此,除其他外java.util.Scanner
!).的所有实现
java.util.Enumeration
####中介(可由行为方法识别,该方法采用不同抽象/接口类型的示例(通常使用命令模式),该示例委托/使用给定示例)java.util.Timer
(全部scheduleXXX()
方法)java.util.concurrent.Executor#execute()
java.util.concurrent.ExecutorService
(the)invokeXXX()
以及submit()
方法)java.util.concurrent.ScheduledExecutorService
(全部scheduleXXX()
方法)java.lang.reflect.Method#invoke()
####memento(可通过行为方法识别,行为方法在内部改变整个示例的状态)java.util.Date
(setter方法就是这样做的,Date
内部由long
值)的所有实现
java.io.Serializable
的所有实现javax.faces.component.StateHolder
####observer(或publish/subscribe)(可由行为方法识别,行为方法根据自身的状态在另一个抽象/接口类型的示例上调用方法)java.util.Observer
/java.util.Observable
(但在现实世界中很少使用)的所有实现
java.util.EventListener
(几乎到处都是)javax.servlet.http.HttpSessionBindingListener
javax.servlet.http.HttpSessionAttributeListenerjavax.faces.event.PhaseListener
####状态(可由行为方法识别,该方法根据可由外部控制的示例状态更改其行为)javax.faces.lifecycle.LifeCycle#execute()
(由控制)FacesServlet
,行为取决于jsf生命周期的当前阶段(状态)策略(可由抽象/接口类型中的行为方法识别,该抽象/接口类型在不同抽象/接口类型的实现中调用方法,该抽象/接口类型已作为方法参数传入策略实现)
java.util.Comparator#compare()
,执行人Collections#sort()
.javax.servlet.http.HttpServlet
,的service()
以及所有doXXX()
采取的方法HttpServletRequest
以及HttpServletResponse
而且实现者必须处理它们(而不是将它们作为示例变量)。javax.servlet.Filter#doFilter()
####模板方法(可由已经具有由抽象类型定义的“默认”行为的行为方法识别)所有非抽象方法
java.io.InputStream
,java.io.OutputStream
,java.io.Reader
以及java.io.Writer
.所有非抽象方法
java.util.AbstractList
,java.util.AbstractSet
以及java.util.AbstractMap
.javax.servlet.http.HttpServlet
,所有doXXX()
默认情况下,方法向响应发送http 405“method not allowed”错误。你可以自由的实现它们中的任何一个。visitor(可由两种不同的抽象/接口类型识别,这两种类型定义了各自采用另一种抽象/接口类型的方法;一个实际调用另一个的方法,另一个执行所需的策略)
javax.lang.model.element.AnnotationValue
以及AnnotationValueVisitor
javax.lang.model.element.Element
以及ElementVisitor
javax.lang.model.type.TypeMirror
以及TypeVisitor
java.nio.file.FileVisitor
以及SimpleFileVisitor
javax.faces.component.visit.VisitContext
以及VisitCallback
6ojccjat2#
rmi是基于代理的。
应该可以引用gof中23种模式中的一种:
抽象工厂:当驱动程序注册时,java.sql接口都从jdbcjar获得它们的具体实现。
生成器:java.lang.stringbuilder。
工厂方法:xml工厂等。
原型:可能是clone(),但我不确定我会买这个。
单例:java.lang.system
adapter:java.awt.event中的适配器类,例如windowadapter。
桥:java.util中的集合类。列表由arraylist实现。
c
w7t8yxp53#
整个挥杆过程中的观察者模式(
Observable
,Observer
)mvc也在摇摆
适配器模式:inputstreamreader和outputstreamwriter注意:
ContainerAdapter
,ComponentAdapter
,FocusAdapter
,KeyAdapter
,MouseAdapter
不是适配器;它们实际上是空对象。太阳的命名选择很差。装饰图案(
BufferedInputStream
可以装饰其他流,如FilterInputStream
)awt工具包和swing可插拔外观类的abstractfactory模式
java.lang.Runtime#getRuntime()
是辛格尔顿吗ButtonGroup
对于中介模式Action
,AbstractAction
可以用于不同的视觉表示来执行相同的代码->命令模式jtable for flyweight模式中的interned string或cellrender(还可以考虑各种池—线程池、连接池、ejb对象池—flyweight实际上是关于共享资源的管理)
Java1.0事件模型是责任链的一个例子,servlet过滤器也是。
集合框架中的迭代器模式
awt/swing中的嵌套容器使用复合模式
awt/swing中的布局管理器就是策略的一个例子
我想还有更多
um6iljoc4#
flyweight与byte、short、integer、long和string的某些值一起使用。
facade在很多地方都有使用,但最明显的是脚本接口。
我想到了singleton-java.lang.runtime。
抽象工厂-也包括脚本和JDBCAPI。
命令-textcomponent的撤消/重做。
解释器-regex(java.util.regex.)和sql(java.sql.)api。
原型-不是100%确定这算不算,但我想
clone()
方法可用于此目的。