Java의 핵심 라이브러리의 GOF 디자인 패턴의 예
-
16-09-2019 - |
문제
나는 GOF Java 디자인 패턴을 배우고 있으며 실제 사례를보고 싶습니다. 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)
(프로토콜 당 싱글 톤 객체를 반환)java.util.EnumSet#of()
javax.xml.bind.JAXBContext#createMarshaller()
그리고 다른 유사한 방법
원기 (창조적 방법으로 인식 가능 a 다른 동일한 속성을 가진 인스턴스)
java.lang.Object#clone()
(수업은 구현해야합니다java.lang.Cloneable
)
하나씩 일어나는 것 (창조적 방법으로 인식 할 수 있습니다 같은 인스턴스 (보통 그 자체) 매번)
구조적 패턴
어댑터 (인스턴스를 취하는 창조적 방법으로 인식 할 수 있습니다 다른 초록/인터페이스 유형 및 자체/다른 초록/인터페이스 유형의 구현을 반환합니다. 장식/재정의 주어진 인스턴스)
java.util.Arrays#asList()
java.util.Collections#list()
java.util.Collections#enumeration()
java.io.InputStreamReader(InputStream)
(반환 aReader
)java.io.OutputStreamWriter(OutputStream)
(반환 aWriter
)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
그리고 더 많은 것들이없는 더 많은 사람들은 그것에 대해 걱정해야합니다 (그러나 주입에 의해 우정 될 수 있음).javax.faces.context.ExternalContext
, 내부적으로 사용하는ServletContext
,HttpSession
,HttpServletRequest
,HttpServletResponse
, 등.
플라이급 (캐시 된 인스턴스를 반환하는 창조적 방법에 의해 인식 가능, 약간의 "multiton"아이디어)
java.lang.Integer#valueOf(int)
(또한 켜져 있습니다Boolean
,Byte
,Character
,Short
,Long
그리고BigDecimal
)
대리 (주어진 초록/인터페이스 유형의 구현을 반환하는 창조적 방법으로 인식 가능합니다. 대표/용도 ㅏ 다른 주어진 초록/인터페이스 유형의 구현)
java.lang.reflect.Proxy
java.rmi.*
javax.ejb.EJB
(설명)javax.inject.Inject
(설명)javax.persistence.PersistenceContext
행동 패턴
책임의 사슬 (간접적으로) 동일한 방법을 호출하는 행동 방법으로 인식 가능 또 다른 구현 같은 대기열의 초록/인터페이스 유형)
명령 (Abstract/Interface 유형에서 행동 방법으로 인식 할 수있는 다른 초록/인터페이스 유형 캡슐화 생성 중 명령 구현에 의해)
- 모든 구현
java.lang.Runnable
- 모든 구현
javax.swing.Action
통역사 (행동 방법으로 인식 가능 a 구조적으로 주어진 인스턴스/유형의 다른 인스턴스/유형; 구문 분석/서식은 패턴의 일부가 아니며 패턴을 결정하고 적용하는 방법).
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
(세터 방법이 그렇게합니다.Date
내부적으로 along
값)- 모든 구현
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 라이프 사이클의 현재 단계 (상태)에 따라 다릅니다)
전략 (Abstract/Interface 유형에서 행동 방법으로 인식 할 수있는 다른 초록/인터페이스 유형 통과 전략 구현에 대한 방법 인수로서)
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 "메서드가 허용되지 않음"오류를 응답에 보냅니다. 당신은 그들 중 누구도 자유롭게 구현할 수 있습니다.
방문객 (2로 인식 가능 다른 각각의 다른 초록/인터페이스 유형; 하나는 실제로 다른 방법을 부르고 다른 하나는 원하는 전략을 실행합니다).
다른 팁
- 전체 스윙 전체의 관찰자 패턴 (
Observable
,Observer
) - MVC도 스윙에 있습니다
- 어댑터 패턴 : InputStreamReader 및 OutputStreamWriter 참고 :
ContainerAdapter
,ComponentAdapter
,FocusAdapter
,KeyAdapter
,MouseAdapter
~이다 ~ 아니다 어댑터; 그들은 실제로 널 짝을 이루는 객체입니다. Sun의 불쌍한 이름의 선택. - 데코레이터 패턴 (
BufferedInputStream
다음과 같은 다른 스트림을 장식 할 수 있습니다FilterInputStream
) - AWT 툴킷 및 스윙 플러그 가능한 룩앤필 클래스의 추상적 인 패턴
java.lang.Runtime#getRuntime()
싱글 톤입니다ButtonGroup
중재자 패턴의 경우Action
,AbstractAction
동일한 코드를 실행하기 위해 다른 시각적 표현에 사용될 수 있습니다 -> 명령 패턴- 플라이급 패턴을 위해 jtable의 인턴 된 문자열 또는 셀러 렌더 (또한 다양한 풀 - 스레드 풀, 연결 풀, EJB 객체 풀 - 플라이 웨이트는 실제로 공유 리소스 관리에 관한 것입니다)
- Java 1.0 이벤트 모델은 서블릿 필터와 마찬가지로 책임 체인의 예입니다.
- 컬렉션 프레임 워크의 반복자 패턴
- AWT/스윙의 중첩 컨테이너 복합 패턴 사용
- AWT/Swing의 레이아웃 관리자는 전략의 예입니다.
그리고 더 많은 것 같습니다
- 플라이급 바이트, 짧은, 정수, 길고 끈의 일부 값과 함께 사용됩니다.
- 정면 많은 장소에서 사용되지만 가장 명백한 것은 스크립팅 인터페이스입니다.
- 하나씩 일어나는 것 -java.lang.runtime이 떠 오릅니다.
- 초록 공장 - 스크립팅 및 JDBC API.
- 명령 - TextComponent의 실행 취소/Redo.
- 통역사 -regex (java.util.regex.) 및 SQL (java.sql.) API.
- 원기 -이 계산 여부는 100% 확실하지 않지만 나는 생각합니다.
clone()
이 목적으로 방법을 사용할 수 있습니다.
RMI는 프록시를 기반으로합니다.
GOF의 23 개 패턴의 대부분에 대해 하나를 인용 할 수 있어야합니다.
- 초록 공장 : Java.SQL 인터페이스는 드라이버가 등록 될 때 JDBC Jar에서 구체적인 구현을 얻습니다.
- 빌더 : java.lang.stringbuilder.
- 공장 방법 : XML 공장 등.
- 프로토 타입 : 아마도 클론 ()이지만, 내가 그것을 구매하는지 잘 모르겠습니다.
- 싱글 톤 : java.lang.system
- 어댑터 : java.awt.event의 어댑터 클래스, 예 : Windowadapter.
- 다리 : java.util의 컬렉션 클래스. ArrayList에 의해 구현 된 목록.
- 복합재 : java.awt. java.awt.component + java.awt.container
- 데코레이터 : Java.io 패키지 전체.
- 정면: 외부 컨텍스트 쿠키, 세션 범위 및 유사한 작업을 수행하기위한 외관으로 동작합니다.
- 플라이급 : 정수, 캐릭터 등
- 프록시 : java.rmi 패키지
- 책임 체인 : 서블릿 필터
- 명령 : 스윙 메뉴 항목
- 통역사 : JDK에서는 직접적으로 없지만 Javacc는 확실히 이것을 사용합니다.
- 반복자 : java.util.iterator 인터페이스; 그보다 명확 할 수 없습니다.
- 중재자 : JMS?
- 기념물:
- 옵저버 : java.util.observer/observable (그래도 나쁜 일)
- 상태:
- 전략:
- 주형:
- 방문객:
23 명 중 10 명에 대한 Java의 사례를 생각할 수는 없지만 내일 더 잘할 수 있는지 알 수 있습니다. 그것이 바로 편집의 것입니다.
추상 공장 패턴은 다양한 장소에서 사용됩니다. 예, DatagramSocketImplFactory
, PreferencesFactory
. 더 많은 것들이 있습니다.
또한 공장 패턴의 인스턴스도 꽤 많이 있습니다.
내가 이것으로 깨진 시계이지만 Java XML API는 공장을 많이 사용합니다. 나는 이것을 보는 것입니다 :
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(source);
String title = XPathFactory.newInstance().newXPath().evaluate("//title", doc);
... 등이.
또한 다양한 버퍼 (StringBuffer, Bytebuffer, StringBuilder)를 사용하여 Builder를 사용하십시오.
java.util.collection#iterator는 공장 방법의 좋은 예입니다. 사용하는 컬렉션의 콘크리트 서브 클래스에 따라 Ierator 구현이 생성됩니다. 공장 슈퍼 클래스 (컬렉션)와 반복기가 모두 인터페이스이므로 때로는 추상적 인 요소와 혼동됩니다. 허용 된 답변 (Balusc)에서 추상적 인 예제의 대부분은 다음과 같은 예입니다. 공장, 원래 GOF 패턴의 일부가 아닌 공장 방법의 단순화 된 버전. Facory에서 공장 클래스 계층 구조가 무너지고 공장은 다른 수단을 사용하여 반환 할 제품을 선택합니다.
- 초록 공장
추상 공장에는 여러 가지 공장 방법이 있으며 각각 다른 제품을 만듭니다. One Factory에서 생산 된 제품은 함께 사용하기위한 것입니다 (프린터와 카트리지는 동일한 (추상) 공장에서 나온 것입니다). 위의 답변에서 언급 된 바와 같이, 플랫폼마다 다른 AWT GUI 구성 요소의 패밀리는 이에 대한 예입니다 (구현은 GOF에 설명 된 구조와 다르지만).