Answers:
您可以在Wikipedia中找到许多设计模式的概述。它还提到了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,FloatBuffer和DoubleBuffer)javax.swing.GroupLayout.Group#addComponent()java.lang.Appendablejava.util.stream.Stream.Builderjava.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.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()new LinkedHashMap(LinkedHashSet<K>, List<V>)返回一个不可修改的链接地图,该地图不会克隆项目,而是使用它们。但是java.util.Collections#newSetFromMap()和singletonXXX()方法非常接近。java.awt.Container#add(Component) (因此,实际上遍及整个Swing)javax.faces.component.UIComponent#getChildren() (因此实际上遍及整个JSF UI)java.io.InputStream,OutputStream,Reader并Writer有一个构造函数取相同类型的实例。java.util.Collections的checkedXXX(),synchronizedXXX()和unmodifiableXXX()方法。javax.servlet.http.HttpServletRequestWrapper 和 HttpServletResponseWrapperjavax.swing.JScrollPanejavax.faces.context.FacesContext,它在内部等使用抽象/接口类型LifeCycle,ViewHandler,NavigationHandler等等而没有终端用户具有至约它的担心(其然而覆写投放通过注射)。javax.faces.context.ExternalContext,其在内部使用ServletContext,HttpSession,HttpServletRequest,HttpServletResponse,等。java.lang.reflect.Proxyjava.rmi.*javax.ejb.EJB(这里的说明)javax.inject.Inject(这里的说明)javax.persistence.PersistenceContextjava.lang.Runnablejavax.swing.Actionjava.util.Iterator(因此还有其他实现java.util.Scanner!)。java.util.Enumerationjava.util.Timer(所有scheduleXXX()方法)java.util.concurrent.Executor#execute()java.util.concurrent.ExecutorService(invokeXXX()和submit()方法)java.util.concurrent.ScheduledExecutorService(所有scheduleXXX()方法)java.lang.reflect.Method#invoke()java.util.Date(setter方法这样做,Date在内部由一个long值表示)java.io.Serializablejavax.faces.component.StateHolderjava.util.Observer/ java.util.Observable(虽然在现实世界中很少使用)java.util.EventListener(因此实际上遍及整个Swing)javax.servlet.http.HttpSessionBindingListenerjavax.servlet.http.HttpSessionAttributeListenerjavax.faces.event.PhaseListenerjavax.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“不允许使用方法”错误。您可以随意实现任何一个或任何一个。Observable,Observer)ContainerAdapter,ComponentAdapter,FocusAdapter,KeyAdapter,MouseAdapter是不适配器; 它们实际上是空对象。Sun命名选择不佳。BufferedInputStream可以装饰其他流,例如FilterInputStream)java.lang.Runtime#getRuntime() 是辛格尔顿ButtonGroup 用于调解员模式Action,AbstractAction可用于不同的视觉表示以执行相同的代码->命令模式我猜还有更多
clone()可以算在内,但是我认为方法可以用于此目的。java.awt和java.swing包不同。实际上,它们共享几乎相同的内在属性,外在属性是它们以UI形式布置的不同UI组件。
RMI基于代理。
应该可以为GoF中的23种模式中的大多数引用一种:
我想不出Java中的23个例子中有10个,但是我看看明天是否可以做得更好。这就是编辑的目的。
java.util.Collection#Iterator是Factory方法的一个很好的例子。根据您使用的Collection的具体子类,它将创建一个Iterator实现。因为创建的Factory超类(集合)和迭代器都是接口,所以有时将它与AbstractFactory混淆。可接受答案(BalusC)中AbstractFactory的大多数示例都是Factory的示例,Factory是工厂方法的简化版本,它不属于原始GoF模式。在Facory中,Factory类层次结构被折叠,并且工厂使用其他方式选择要退货的产品。
抽象工厂有多种工厂方法,每种方法创建不同的产品。一个工厂生产的产品打算一起使用(您的打印机和墨盒最好来自同一(抽象的)工厂)。正如上面答案中提到的,不同平台的AWT GUI组件家族就是一个例子(尽管其实现方式与Gof中描述的结构不同)。
javax.lang.model.element定义的游客;)我不是很确定是否doXXX和doFilter在“策略”。