ฉันกำลังเรียนรู้รูปแบบการออกแบบ Java ของ GoF และฉันต้องการเห็นตัวอย่างชีวิตจริงของพวกเขา ตัวอย่างที่ดีของรูปแบบการออกแบบเหล่านี้ในไลบรารีหลักของ Java คืออะไร
ฉันกำลังเรียนรู้รูปแบบการออกแบบ Java ของ GoF และฉันต้องการเห็นตัวอย่างชีวิตจริงของพวกเขา ตัวอย่างที่ดีของรูปแบบการออกแบบเหล่านี้ในไลบรารีหลักของ Java คืออะไร
คำตอบ:
คุณสามารถค้นหาภาพรวมของจำนวนมากของรูปแบบการออกแบบในวิกิพีเดีย นอกจากนี้ยังกล่าวถึงรูปแบบที่กล่าวถึงโดย 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.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)
(ส่งคืนวัตถุ Singleton ต่อโปรโตคอล)java.util.EnumSet#of()
javax.xml.bind.JAXBContext#createMarshaller()
และวิธีการอื่นที่คล้ายคลึงกันjava.lang.Object#clone()
(ชั้นต้องดำเนินการjava.lang.Cloneable
)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>)
ส่งคืนแผนที่ที่เชื่อมโยงซึ่งไม่สามารถแก้ไขได้ซึ่งไม่ได้คัดลอกรายการ แต่ใช้พวกมัน java.util.Collections#newSetFromMap()
และsingletonXXX()
วิธีการอย่างไรมาใกล้เคียงjava.awt.Container#add(Component)
(เกือบทั้งหมดสวิงจึง)javax.faces.component.UIComponent#getChildren()
(ในทางปฏิบัติทั่ว JSF UI)java.io.InputStream
, OutputStream
, Reader
และWriter
มีการคอนสตรัคตัวอย่างของประเภทเดียวกันjava.util.Collections
ที่checkedXXX()
, synchronizedXXX()
และunmodifiableXXX()
วิธีการjavax.servlet.http.HttpServletRequestWrapper
และ HttpServletResponseWrapper
javax.swing.JScrollPane
javax.faces.context.FacesContext
มันใช้ภายในหมู่คนอื่น ๆ ประเภทนามธรรม / อินเตอร์เฟซLifeCycle
, ViewHandler
, NavigationHandler
และอื่น ๆ อีกมากมายโดยไม่ต้องว่า enduser ที่มีความกังวลเกี่ยวกับเรื่องนี้ (ซึ่งมี แต่สามารถแก้ไขได้โดยการฉีด)javax.faces.context.ExternalContext
ซึ่งภายในใช้ServletContext
, HttpSession
, HttpServletRequest
, HttpServletResponse
ฯลฯjava.lang.reflect.Proxy
java.rmi.*
javax.ejb.EJB
( คำอธิบายที่นี่ )javax.inject.Inject
( คำอธิบายที่นี่ )javax.persistence.PersistenceContext
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
( invokeXXX()
และsubmit()
วิธีการ)java.util.concurrent.ScheduledExecutorService
( scheduleXXX()
วิธีการทั้งหมด)java.lang.reflect.Method#invoke()
java.util.Date
(เมธอด setter ทำสิ่งDate
นั้นแทนlong
ค่าภายใน)java.io.Serializable
javax.faces.component.StateHolder
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)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
มีไม่ได้อะแดปเตอร์; พวกเขาเป็นวัตถุ Null ตัวเลือกการตั้งชื่อแย่โดยซันBufferedInputStream
สามารถตกแต่งสตรีมอื่น ๆ เช่นFilterInputStream
)java.lang.Runtime#getRuntime()
คือซิงเกิลButtonGroup
สำหรับรูปแบบคนกลางAction
, AbstractAction
อาจจะใช้สำหรับการแสดงภาพที่แตกต่างกันในการดำเนินการรหัสเดียวกัน -> รูปแบบคำสั่งและอีกมากมายฉันเดา
clone()
วิธีg สามารถนำมาใช้เพื่อจุดประสงค์นี้java.awt
และjava.swing
แพ็คเกจ อันที่จริงพวกเขาแบ่งปันคุณสมบัติที่แท้จริงที่เหมือนกันเกือบและคุณลักษณะภายนอกเป็นองค์ประกอบ UI ที่แตกต่างกันที่พวกเขาวางในรูปแบบ UI
RMI ขึ้นอยู่กับพร็อกซี
ควรเป็นไปได้ที่จะกล่าวถึงรูปแบบหนึ่งใน 23 รูปแบบส่วนใหญ่ใน GoF:
ฉันไม่สามารถคิดถึงตัวอย่างใน Java สำหรับ 10 จาก 23 แต่ฉันจะดูว่าฉันจะทำได้ดีขึ้นในวันพรุ่งนี้ นั่นคือสิ่งที่แก้ไขสำหรับ
รูปแบบนามธรรมของโรงงานถูกนำมาใช้ในสถานที่ต่าง ๆ DatagramSocketImplFactory
เช่น PreferencesFactory
, มีอีกมากมาย --- ค้นหา Javadoc สำหรับอินเทอร์เฟซที่มีคำว่า "โรงงาน" ในชื่อ
นอกจากนี้ยังมีรูปแบบ Factory ค่อนข้างน้อยเช่นกัน
แม้ว่าฉันจะเรียงลำดับของนาฬิกาแตกหัก แต่ Java XML API ก็ใช้ Factory เป็นจำนวนมาก ฉันหมายถึงเพียงแค่ดูที่:
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(source);
String title = XPathFactory.newInstance().newXPath().evaluate("//title", doc);
...และอื่น ๆ และอื่น ๆ.
นอกจากนี้ยังมีตัวสร้างบัฟเฟอร์ (StringBuffer, ByteBuffer, StringBuilder) ที่หลากหลาย
java.util.Collection # Iterator เป็นตัวอย่างที่ดีของวิธีการของโรงงาน ขึ้นอยู่กับคลาสย่อยที่เป็นรูปธรรมของคอลเล็กชันที่คุณใช้มันจะสร้างการใช้ Iterator เนื่องจากทั้งโรงงาน superclass (คอลเลกชัน) และ Iterator ที่สร้างขึ้นเป็นอินเตอร์เฟสบางครั้งจึงสับสนกับ ตัวอย่างส่วนใหญ่สำหรับ AbstractFactory ในคำตอบที่ได้รับการยอมรับ (BalusC) เป็นตัวอย่างของFactoryซึ่งเป็นเวอร์ชันของวิธีการในโรงงานที่ไม่ซับซ้อนซึ่งไม่ได้เป็นส่วนหนึ่งของรูปแบบ GoF ดั้งเดิม ใน Facory ลำดับชั้นคลาสของโรงงานจะถูกยุบและโรงงานใช้วิธีการอื่นเพื่อเลือกผลิตภัณฑ์ที่จะส่งคืน
โรงงานที่เป็นนามธรรมมีวิธีการที่หลากหลายจากโรงงาน ผลิตภัณฑ์ที่ผลิตโดยโรงงานหนึ่งมีวัตถุประสงค์เพื่อใช้ร่วมกัน (เครื่องพิมพ์และตลับหมึกของคุณที่ดีกว่ามาจากโรงงานเดียวกัน (นามธรรม)) ดังที่ได้กล่าวไว้ในคำตอบข้างต้นตระกูลของส่วนประกอบ AWT GUI ที่แตกต่างจากแพลตฟอร์มหนึ่งไปอีกแพลตฟอร์มเป็นตัวอย่างของสิ่งนี้ (แม้ว่าการนำไปปฏิบัติจะแตกต่างจากโครงสร้างที่อธิบายไว้ใน Gof)
javax.lang.model.element
กำหนดผู้เยี่ยมชม;) ฉันไม่แน่ใจว่าdoXXX
และdoFilter
เป็น "กลยุทธ์" หรือไม่