在 JDK(Java Development Kit)類庫中,開發人員使用了大量設計模式,正由於如此,咱們能夠在不修改 JDK 源碼的前提下開發出本身的應用軟件。研究 JDK 類庫中的模式實例也不失爲學習如何使用設計模式的一個好方式。之後用到如今設計模式了本身去看看JDK的源碼仍是很方便的。
(1) 抽象工廠模式(Abstract Factory)
• java.util.Calendar#getInstance()
• java.util.Arrays#asList()
• java.util.ResourceBundle#getBundle()
• java.net.URL#openConnection()
• java.sql.DriverManager#getConnection()
• java.sql.Connection#createStatement()
• java.sql.Statement#executeQuery()
• java.text.NumberFormat#getInstance()
• java.lang.management.ManagementFactory (全部 getXXX()方法)
• java.nio.charset.Charset#forName()
• javax.xml.parsers.DocumentBuilderFactory#newInstance()
• javax.xml.transform.TransformerFactory#newInstance()
• javax.xml.xpath.XPathFactory#newInstance()
(2) 建造者模式(Builder)
• java.lang.StringBuilder#append()
• java.lang.StringBuffer#append()
• java.nio.ByteBuffer#put() (CharBuffer, ShortBuffer, IntBuffer,LongBuffer,
FloatBuffer 和 DoubleBuffer 與之相似)
• javax.swing.GroupLayout.Group#addComponent()
• java.sql.PreparedStatement
• java.lang.Appendable 的全部實現類
(3) 工廠方法模式(Factory Method)
• java.lang.Object#toString() (在其子類中能夠覆蓋該方法)
• java.lang.Class#newInstance()
• java.lang.Integer#valueOf(String) (Boolean, Byte, Character,Short, Long,
Float 和 Double 與之相似)
• java.lang.Class#forName()
• java.lang.reflect.Array#newInstance()
• java.lang.reflect.Constructor#newInstance()
(4) 原型模式(Prototype)
• java.lang.Object#clone() (支持淺克隆的類必須實現 java.lang.Cloneable
接口 )
(5) 單例模式 (Singleton)
• java.lang.Runtime#getRuntime()
• java.awt.Desktop#getDesktop()
(1) 適配器模式(Adapter) •java.util.Arrays#asList() •javax.swing.JTable(TableModel) •java.io.InputStreamReader(InputStream) •java.io.OutputStreamWriter(OutputStream) •javax.xml.bind.annotation.adapters.XmlAdapter#marshal() •javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal() (2) 橋接模式(Bridge) • AWT (提供了抽象層映射於實際的操做系統) •JDBC (3) 組合模式(Composite) •javax.swing.JComponent#add(Component) •java.awt.Container#add(Component) •java.util.Map#putAll(Map) •java.util.List#addAll(Collection) •java.util.Set#addAll(Collection) (4) 裝飾模式(Decorator) •java.io.BufferedInputStream(InputStream) •java.io.DataInputStream(InputStream) •java.io.BufferedOutputStream(OutputStream) •java.util.zip.ZipOutputStream(OutputStream) •java.util.Collections#checked[List|Map|Set|SortedSet|SortedMap]() (5) 外觀模式(Facade) •java.lang.Class •javax.faces.webapp.FacesServlet (6) 享元模式(Flyweight) •java.lang.Integer#valueOf(int) •java.lang.Boolean#valueOf(boolean) • java.lang.Byte#valueOf(byte) •java.lang.Character#valueOf(char) (7) 代理模式(Proxy) • java.lang.reflect.Proxy •java.rmi.* 3. 行爲型模式: (1) 職責鏈模式(Chain of Responsibility) •java.util.logging.Logger#log() •javax.servlet.Filter#doFilter() (2) 命令模式(Command) • java.lang.Runnable • javax.swing.Action (3) 解釋器模式(Interpreter) • java.util.Pattern • java.text.Normalizer • java.text.Format • javax.el.ELResolver (4) 迭代器模式(Iterator) • java.util.Iterator • java.util.Enumeration (5) 中介者模式(Mediator) • 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() (6) 備忘錄模式(Memento) •java.util.Date •java.io.Serializable •javax.faces.component.StateHolder (7) 觀察者模式(Observer) •java.util.Observer/java.util.Observable •java.util.EventListener (全部子類) •javax.servlet.http.HttpSessionBindingListener •javax.servlet.http.HttpSessionAttributeListener •javax.faces.event.PhaseListener (8) 狀態模式(State) •java.util.Iterator •javax.faces.lifecycle.LifeCycle#execute() (9) 策略模式(Strategy) • java.util.Comparator#compare() • javax.servlet.http.HttpServlet • javax.servlet.Filter#doFilter() (10) 模板方法模式(Template Method) •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() (11) 訪問者模式(Visitor) •javax.lang.model.element.AnnotationValue 和 AnnotationValueVisitor •javax.lang.model.element.Element 和 ElementVisitor •javax.lang.model.type.TypeMirror 和 TypeVisitor