Java 핵심 라이브러리의 GoF 디자인 패턴 예


672

GoF Java 디자인 패턴을 배우고 있으며 실제 사례를보고 싶습니다. Java 핵심 라이브러리에서 이러한 디자인 패턴의 좋은 예는 무엇입니까?

답변:


3229

Wikipedia 에서 많은 디자인 패턴에 대한 개요를 찾을 수 있습니다 . 또한 GoF에서 언급 한 패턴을 언급합니다. 여기에 그것들을 요약하고 Java SE 및 Java EE API에서 모두 가능한 한 많은 패턴 구현을 할당하려고합니다.


창조 패턴

추상 팩토리 (공장 자체를 반환하는 생성 방법으로 인식 가능하며 다른 추상 / 인터페이스 유형을 만드는 데 사용될 수 있음)

빌더 (인스턴스 자체를 리턴하는 작성 메소드로 인식 가능)

팩토리 메소드 (추상 / 인터페이스 유형의 구현을 리턴하는 작성 메소드로 인식 가능)

프로토 타입 ( 같은 속성을 가진 다른 인스턴스를 반환하는 생성 방법으로 인식 가능 )

싱글 톤 ( 매번 동일한 인스턴스 (보통 자체)을 리턴하는 작성 메소드로 인식 가능 )


구조 패턴

어댑터 ( 다른 추상 / 인터페이스 유형 의 인스턴스를 가져 오고 주어진 인스턴스 를 장식 / 재정의 하는 자체 / 다른 추상 / 인터페이스 유형의 구현을 리턴하는 작성 메소드로 인식 가능 )

브리지 ( 다른 추상 / 인터페이스 유형 의 인스턴스 를 가져와 주어진 인스턴스 를 위임 / 사용 하는 자체 추상 / 인터페이스 유형의 구현을 반환하는 생성 방법으로 인식 가능 )

  • 아직 아무도 생각 나지 않습니다. 가상의 예로들 수 new LinkedHashMap(LinkedHashSet<K>, List<V>)변경 불가능한 연결 항목을 복제하지 않는지도 만 돌려 사용 을. java.util.Collections#newSetFromMap()singletonXXX()방법은 그러나 가까이 온다.

컴포지트 ( 동일한 추상 / 인터페이스 유형 의 인스턴스를 트리 구조로 가져가는 동작 방식으로 인식 가능 )

데코레이터 ( 동작을 추가하는 동일한 추상 / 인터페이스 유형 의 인스턴스를 생성하는 생성 방법으로 인식 가능 )

외관 ( 다른 독립적 인 추상 / 인터페이스 유형의 인스턴스를 내부적으로 사용하는 행동 방법으로 인식 가능 )

Flyweight (캐시 된 인스턴스를 리턴하는 작성 메소드, 약간 "멀티 톤"아이디어로 인식 가능)

프록시 (주어진 추상 / 인터페이스 유형 의 다른 구현을 위임 / 사용 하는 주어진 추상 / 인터페이스 유형의 구현을 리턴하는 작성 메소드로 인식 가능 )


행동 패턴

책임 사슬 ( 큐에서 동일한 추상 / 인터페이스 유형 의 다른 구현 에서 동일한 메소드를 간접적으로 호출하는 행동 메소드로 인식 가능 )

명령 ( 생성하는 동안 명령 구현 으로 캡슐화다른 추상 / 인터페이스 유형 의 구현에서 메소드를 호출하는 추상 / 인터페이스 유형의 동작 메소드로 인식 가능 )

해석기 ( 특정 인스턴스 / 유형 의 구조적으로 다른 인스턴스 / 유형을 리턴하는 행동 방법으로 인식 가능 ; 구문 분석 / 포맷팅은 패턴의 일부가 아니며 패턴을 판별하고 적용하는 방법에 유의하십시오)

반복자 ( 큐에서 다른 유형의 인스턴스를 순차적으로 리턴하는 동작 메소드로 인식 가능 )

중재자 (주어진 인스턴스를 위임 / 사용하는 다른 추상 / 인터페이스 유형의 인스턴스 (일반적으로 명령 패턴 사용)를 사용하는 행동 방법으로 인식 가능)

Memento ( 전체 인스턴스 의 상태를 내부적으로 변경하는 행동 방법으로 인식 가능 )

관찰자 (또는 공개 / 구독) ( 자체 상태에 따라 다른 추상 / 인터페이스 유형 의 인스턴스에서 메소드를 호출하는 동작 메소드로 인식 가능 )

상태 (외부 적으로 제어 할 수있는 인스턴스 상태에 따라 동작을 변경하는 동작 방법으로 인식 가능)

전략 ( 전략 구현에 메소드 인수로 전달다른 추상 / 인터페이스 유형 의 구현에서 메소드를 호출하는 추상 / 인터페이스 유형의 행동 메소드로 인식 가능 )

템플리트 메소드 (추상 유형에 의해 이미 정의 된 "기본"동작이있는 동작 메소드로 인식 가능)

방문자는 (두 가지 recognizeable 의해 다른 각각 얻어 정의 방법 갖는 추상 / 인터페이스 타입 다른 추상 / 인터페이스 타입을 상기 하나 실제로 다른 방법 및 다른 실행하는 것이 바람직한 전략에 호출)


23
인상적 .. :) +1. javax.lang.model.element방문자를 정의) 나는 확실히인지 확실하지 않다 doXXXdoFilter"전략"입니다.
Bozho

16
언급 된 빌더, 예를 들어 StrinbgBuilder는 모두 빌더 패턴의 예가 아닙니다. 그러나 그들을 건축업자로 간주하는 것은 매우 일반적인 실수입니다 (그래서 당신은 실제로 ^ _ ^을 비난하지 않습니다)
Angel O'Sphere

77
@BalusC, 물어볼 질문이 있습니다. Java 및 JSF 의 WHOLE 소스 코드 를 읽었습니까 ?
Tapas Bose

20
@Tapas : 나는 모든 것을 읽지 않았고, 필요한 부분 만 읽었거나 "그들이"어떻게했는지 궁금했다.
BalusC

7
"Factory Method"아래의 대부분의 예는 GoF 패턴이 아닌 "static factory"의 예입니다. 정확하지 않습니다.
ring bearer

107
  1. 전체 스윙에서 관찰자 패턴 ( Observable, Observer)
  2. 스윙에도 MVC
  3. 어댑터 패턴 : InputStreamReader와의 OutputStreamWriter의 참고 : ContainerAdapter, ComponentAdapter, FocusAdapter, KeyAdapter, MouseAdapter입니다 하지 어댑터; 그것들은 실제로 널 오브젝트입니다. Sun의 이름이 잘못 지정되었습니다.
  4. 데코레이터 패턴 ( BufferedInputStream와 같은 다른 스트림을 장식 할 수 있음 FilterInputStream)
  5. AWT 툴킷 및 Swing 플러그 가능 Look & Feel 클래스의 AbstractFactory 패턴
  6. java.lang.Runtime#getRuntime() 싱글턴입니다
  7. ButtonGroup 중재자 패턴
  8. Action, AbstractAction동일한 코드를 실행하는 다른 시각적 표현에 사용될 수있다 -> 커맨드 패턴
  9. Flyweight 패턴을위한 JTable의 Interned Strings 또는 CellRender
  10. Java 1.0 이벤트 모델은 서블릿 필터와 마찬가지로 책임 체인의 예입니다.
  11. 컬렉션 프레임 워크의 반복자 패턴
  12. AWT / Swing의 중첩 컨테이너는 복합 패턴을 사용합니다.
  13. AWT / Swing의 레이아웃 관리자는 전략의 예입니다

그리고 더 많은 것 같아


1
MouseAdapter에 대한 팁 감사합니다. 이 exaplanation을 발견했습니다 : stackoverflow.com/questions/9244185/…
Lincoln

Swing은 MVC를 기반 으로 느슨하게 진행 됩니다. View와 Controller를 하나의 클래스로 축소했습니다.
Matthias Braun

51
  1. Flyweight 는 Byte, Short, Integer, Long 및 String의 일부 값과 함께 사용됩니다.
  2. Facade 는 여러 곳에서 사용되지만 가장 분명한 것은 Scripting 인터페이스입니다.
  3. 싱글 톤-java.lang. 런타임이 떠 오릅니다.
  4. Abstract Factory- 스크립팅 및 JDBC API.
  5. 명령 -TextComponent의 실행 취소 / 다시 실행
  6. 해석기 -RegEx (java.util.regex. ) 및 SQL (java.sql. ) API.
  7. 프로토 타입 -이 숫자가 100 % 확실하지는 않지만이 clone()방법으로 사용할 수 있다고 생각합니다.

1
Flyweight 패턴 관련 : 레이아웃 관리자 java.awtjava.swing패키지 가 다를 수 있습니다 . 실제로, 그들은 거의 동일한 고유 속성을 공유하고 외부 속성은 UI 형식으로 배치되는 다른 UI 구성 요소입니다.
Vitaly

@NawaMan 당신이 말한 5. Comand TextComponent의 Undo / Redo. 나는 그것이 명령이 아닌 기념품이라고 생각합니다. 또는 아마도 둘 다입니다.
Stimpson Cat

관련 질문 -stackoverflow.com/questions/61284856/… 에서 저를 도와 주시겠습니까 ? 이 간단한 예제에서 명령 패턴을 사용했지만 문제를 해결하는 올바른 방법인지 확실하지 않습니다.
Tom Joe

42

RMI는 프록시를 기반으로합니다.

GoF에서 23 가지 패턴 중 하나를 인용 할 수 있어야합니다.

  1. Abstract Factory : java.sql 인터페이스는 드라이버가 등록 될 때 JDBC JAR에서 구체적으로 구현됩니다.
  2. 빌더 : java.lang.StringBuilder.
  3. 팩토리 메소드 : XML 팩토리 등.
  4. 프로토 타입 : 아마도 clone ()이지만 그것을 구입하고 있는지 확실하지 않습니다.
  5. 싱글 톤 : java.lang.System
  6. 어댑터 : java.awt.event의 어댑터 클래스 (예 : WindowAdapter)
  7. 브릿지 : java.util의 콜렉션 클래스. ArrayList로 구현 된 목록입니다.
  8. 복합 : java.awt. java.awt.Component + java.awt.Container
  9. 데코레이터 : 모든 java.io 패키지.
  10. 외관 : ExternalContext 는 쿠키, 세션 범위 및 유사한 작업을 수행하기위한 외관으로 동작합니다.
  11. 플라이급 : 정수, 문자 등
  12. 프록시 : java.rmi 패키지
  13. 책임의 사슬 : 서블릿 필터
  14. 명령 : 스윙 메뉴 항목
  15. 통역사 : JDK에는 직접적으로는 없지만 JavaCC는 이것을 확실히 사용합니다.
  16. 반복자 : java.util.Iterator interface; 그보다 더 명확하지 않습니다.
  17. 중재자 : JMS?
  18. 기념물:
  19. 관찰자 : java.util.Observer/Observable (나쁜 짓이지만)
  20. 상태:
  21. 전략:
  22. 주형:
  23. 방문객:

23 개 중 10 개에 대한 Java 예제는 생각할 수 없지만 내일 더 잘할 수 있는지 볼 수 있습니다. 그것이 편집을위한 것입니다.


28

추상 팩토리 패턴은 다양한 장소에서 사용됩니다. 예, DatagramSocketImplFactory, PreferencesFactory. 이름에 "Factory"라는 단어가있는 인터페이스에 대한 Javadoc을 더 많이 검색합니다.

또한 팩토리 패턴의 인스턴스도 상당히 있습니다.


22

이 시계로 고장난 시계이지만 Java XML API는 Factory를 많이 사용합니다. 나는 이것 만 봐라.

Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(source);
String title = XPathFactory.newInstance().newXPath().evaluate("//title", doc);

... 등등.

또한 다양한 버퍼 (StringBuffer, ByteBuffer, StringBuilder)는 Builder를 사용합니다.


21

java.util.Collection # Iterator는 팩토리 메소드의 좋은 예입니다. 사용하는 Collection의 구체적 서브 클래스에 따라 Iterator 구현이 작성됩니다. Factory 슈퍼 클래스 (Collection)와 생성 된 Iterator는 모두 인터페이스이기 때문에 때때로 AbstractFactory와 혼동됩니다. 허용 된 답변 (BalusC)에서 AbstractFactory에 대한 대부분의 예제는 Factory Go의 패턴이 아닌 Factory Method의 단순화 된 버전 인 Factory의 예제입니다 . Facory에서 팩토리 클래스 계층 구조가 축소되고 팩토리는 다른 방법을 사용하여 반품 할 제품을 선택합니다.

  • 추상 공장

추상 팩토리에는 각각 다른 제품을 생성하는 여러 팩토리 메소드가 있습니다. 한 공장에서 생산 된 제품은 함께 사용하도록 고안되었습니다 (프린터와 카트리지는 동일한 (추상) 공장에서 제조하는 것이 좋습니다). 위의 답변에서 언급했듯이 플랫폼마다 다른 AWT GUI 구성 요소 제품군은 이에 대한 예입니다 (구현 방법은 Gof에 설명 된 구조와 다릅니다).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.