Java 源碼里的設(shè)計模式
Java 源碼里的設(shè)計模式
從 維基百科 中,可以讓你對大部分設(shè)計模式有一個概覽,而且它也指出了哪些設(shè)計模式是 GoF 中規(guī)范.下面列出可以從 JavaSE 和 JavaEE API 中找到的設(shè)計模式:
創(chuàng)建型模式
抽象工廠
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.util.Calendar#getInstance() java.util.ResourceBundle#getBundle() java.text.NumberFormat#getInstance() java.nio.charset.Charset#forName() java.net.URLStreamHandlerFactory#createURLStreamHandler(String)
原型模式
java.lang.Object#clone()(類需要實現(xiàn) java.lang.Cloneable 接口)
單例模式
java.lang.Runtime#getRuntime() java.awt.Desktop#getDesktop() java.lang.System#getSecurityManager()
結(jié)構(gòu)型模式
適配器模式
java.util.Arrays#asList() java.io.InputStreamReader(InputStream) (返回 Reader) java.io.OutputStreamWriter(OutputStream)(返回 Writer) javax.xml.bind.annotation.adapters.XmlAdapter#marshal() 和 #unmarshal()
橋模式
暫時沒有發(fā)現(xiàn)
合成模式
java.awt.Container#add(Component)(Swing 中幾乎所有類都使用) javax.faces.component.UIComponent#getChildren()(JSF UI 中幾乎所有類都使用)
裝飾模式
java.io.InputStream, OutputStream, Reader 和 Writer 的所有子類都有一個使用 InputStream, OutputStream, Reader, Writer 的構(gòu)造器 java.util.Collections 中的 checkedXXX(), synchronizedXXX() 和 unmodifiableXXX() 方法 javax.servlet.http.HttpServletRequestWrapper 和 HttpServletResponseWrapper
門面模式
javax.faces.context.FacesContext,其內(nèi)部使用了 LifeCycle, ViewHandler, NavigationHandler 等接口或抽象類,沒有這一個門面類,終端就需要考慮如何去使用接口或抽象類(實際上不需要,因為門面類通過反射完成了)javax.faces.context.ExternalContext, 其內(nèi)部使用了 ServletContext, HttpSession, HttpServletRequest, HttpServletResponse 等
享元模式
java.lang.Integer#valueOf(int),類似得還有 Boolean, Byte, Character, Short 和 Long
代理模式
java.lang.reflect.Proxy java.rmi.*(所有 api)
表現(xiàn)型模式
責(zé)任鏈模式
java.util.logging.Logger#log() javax.servlet.Filter#doFilter()
命令模式
所有 java.lang.Runnable 的實現(xiàn) 所有 javax.swing.Action 的實現(xiàn)
解釋器模式
java.util.Pattern java.text.Normalizer 所有 java.text.Format 的子類 所有 javax.el.ELResolver 的子類
迭代模式
所有 java.util.Iterator 的實現(xiàn)(因此也包含了所有 java.util.Scanner 的子類) 所有 java.util.Enumeration 的實現(xiàn)
中介模式
java.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(setXXX 方法更新的就是其內(nèi)部的 Date 的值)java.io.Serializable 的所有實現(xiàn)javax.faces.component.StateHolder 的所有實現(xiàn)
觀察者模式(訂閱模式)
java.util.Observer/java.util.Observable(實際應(yīng)用中,很少會用到)java.util.EventListener 的所有實現(xiàn)(幾乎包含了所有 Swing 中使用到的類)javax.servlet.http.HttpSessionBindingListenerjavax.servlet.http.HttpSessionAttributeListenerjavax.faces.event.PhaseListener
狀態(tài)模式
javax.faces.lifecycle.LifeCycle#execute()(由FacesServlet控制,行為是依賴于當(dāng)前JSF生命周期階段(狀態(tài)))
策略模式
java.util.Comparator#compare(), 在 Collections#sort() 中會使用到.javax.servlet.http.HttpServlet,service() 和 所有 doXXX() 方法都以 HttpServletRequest 和 HttpServletResponse 作為參數(shù),所有方法的實現(xiàn)都需要顯式處理這兩個參數(shù)(而不是持有這個變量。)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() 方法,這些方法默認返回 405 "Method Not Allowed" ,你可以自由地選擇覆蓋實現(xiàn)其中的一個或多個。
訪問者模式
javax.lang.model.element.AnnotationValue 和 AnnotationValueVisitorjavax.lang.model.element.Element 和 ElementVisitorjavax.lang.model.type.TypeMirror 和 TypeVisitorjava.nio.file.FileVisitor 和 SimpleFileVisitor
附錄拓展:
設(shè)計模式-百度百科
stackoverflow原址: http://stackoverflow.com/questions/1673841/examples-of-gof-design-patterns-in-javas-core-libraries
長按關(guān)注,學(xué)習(xí)更多
推薦閱讀
