ฉันกำลังเรียนรู้รูปแบบการออกแบบ 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.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) (ส่งคืนวัตถุ 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 และ HttpServletResponseWrapperjavax.swing.JScrollPanejavax.faces.context.FacesContextมันใช้ภายในหมู่คนอื่น ๆ ประเภทนามธรรม / อินเตอร์เฟซLifeCycle, ViewHandler, NavigationHandlerและอื่น ๆ อีกมากมายโดยไม่ต้องว่า enduser ที่มีความกังวลเกี่ยวกับเรื่องนี้ (ซึ่งมี แต่สามารถแก้ไขได้โดยการฉีด)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.Patternjava.text.Normalizerjava.text.Formatjavax.el.ELResolverjava.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(เกือบทั้งหมดสวิงจึง)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.Readerjava.io.Writerjava.util.AbstractList, และjava.util.AbstractSetjava.util.AbstractMapjavax.servlet.http.HttpServletdoXXX()วิธีการทั้งหมดโดยค่าเริ่มต้นจะส่งข้อผิดพลาด "ไม่อนุญาตให้ใช้" 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เป็น "กลยุทธ์" หรือไม่