原文:http://stackoverflow.com/questions/1673841/examples-of-gof-design-patterns
创建型模式
抽象工厂
-
javax.xml.parsers.DocumentBuilderFactory#newInstance() -
javax.xml.transform.TransformerFactory#newInstance() -
javax.xml.xpath.XPathFactory#newInstance()
Builder
-
java.lang.StringBuilder#append()(unsynchronized) -
java.lang.StringBuffer#append()(synchronized) -
java.nio.ByteBuffer#put()(also onCharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBufferandDoubleBuffer) -
javax.swing.GroupLayout.Group#addComponent() - All implementations of
java.lang.Appendable
工厂方法
-
java.util.Calendar#getInstance() -
java.util.ResourceBundle#getBundle() -
java.text.NumberFormat#getInstance() -
java.nio.charset.Charset#forName() -
java.net.URLStreamHandlerFactory#createURLStreamHandler(String)(Returns singleton object per protocol)
原型
-
java.lang.Object#clone()(the class has to implementjava.lang.Cloneable)
单例
结构型模式
-
适配器 (把一种接口类型转换成另一种接口类型)
-
java.util.Arrays#asList() -
java.io.InputStreamReader(InputStream)(returns aReader) -
java.io.OutputStreamWriter(OutputStream)(returns aWriter) -
javax.xml.bind.annotation.adapters.XmlAdapter#marshal()and#unmarshal()
组合
-
java.awt.Container#add(Component)(practically all over Swing thus) -
javax.faces.component.UIComponent#getChildren()(practically all over JSF UI thus)
装饰器
- All subclasses of
java.io.InputStream,OutputStream,ReaderandWriterhave a constructor taking an instance of same type. -
java.util.Collections, thecheckedXXX(),synchronizedXXX()andunmodifiableXXX()methods. -
javax.servlet.http.HttpServletRequestWrapperandHttpServletResponseWrapper
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 typesLifeCycle,ViewHandler,NavigationHandlerand many more without that the enduser has to worry about it (which are however overrideable by injection). -
javax.faces.context.ExternalContext, which internally usesServletContext,HttpSession,HttpServletRequest,HttpServletResponse, etc.
Flyweight (recognizeable by creational methods returning a cached instance, a bit the "multiton" idea)
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.*, the whole API actually.
Behavioral patterns
Chain of responsibility (recognizeable by behavioral methods which (indirectly) invokes the same method inanother implementation of same abstract/interface type in a queue)
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 alsojava.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(allscheduleXXX()methods) -
java.util.concurrent.Executor#execute() -
java.util.concurrent.ExecutorService(theinvokeXXX()andsubmit()methods) -
java.util.concurrent.ScheduledExecutorService(allscheduleXXX()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,Dateis internally represented by alongvalue) - 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 which changes its behaviour depending on the instance's state which can be controlled externally)
-
javax.faces.lifecycle.LifeCycle#execute()(controlled byFacesServlet, the behaviour is dependent on current phase (state) of JSF lifecycle)
Strategy (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 passed-in as method argument into the strategy implementation)
-
java.util.Comparator#compare(), executed by among othersCollections#sort(). -
javax.servlet.http.HttpServlet, theservice()and alldoXXX()methods takeHttpServletRequestandHttpServletResponseand the implementor has to process them (and not to get hold of them as instance variables!). -
javax.servlet.Filter#doFilter()
Template method (recognizeable by behavioral methods which already have a "default" behaviour definied by an abstract type)
- All non-abstract methods of
java.io.InputStream,java.io.OutputStream,java.io.Readerandjava.io.Writer. - All non-abstract methods of
java.util.AbstractList,java.util.AbstractSetandjava.util.AbstractMap. -
javax.servlet.http.HttpServlet, all thedoXXX()methods by default sends a HTTP 405 "Method Not Allowed" error to the response. You're free to implement none or any of them.
Visitor (recognizeable by two different abstract/interface types which has methods definied which takes each theother abstract/interface type; the one actually calls the method of the other and the other executes the desired strategy on it)
-
javax.lang.model.element.AnnotationValueandAnnotationValueVisitor -
javax.lang.model.element.ElementandElementVisitor -
javax.lang.model.type.TypeMirrorandTypeVisitor
-
1632

被折叠的 条评论
为什么被折叠?



