>

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


  • 답변 # 1

    Wikipedia에서 많은 디자인 패턴에 대한 개요를 찾을 수 있습니다. 또한 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()  (또한 CharBufferShortBuffer 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()  다른 유사한 방법

    시제품(같은 속성을 가진다른인스턴스를 반환하는 생성 방법으로 인식 가능)

    java.lang.Object#clone()  (클래스는 java.lang.Cloneable 를 구현해야합니다. )

    Singleton(매번같은인스턴스를 반환하는 생성 방법으로 인식 가능)

    java.lang.Runtime#getRuntime()

    java.awt.Desktop#getDesktop()

    java.lang.System#getSecurityManager()

    <시간> 구조 패턴 어댑터(다른추상/인터페이스 유형의 인스턴스를 가져 와서장식/재정의되는 자체/다른 추상/인터페이스 유형의 구현을 반환하는 생성 방법으로 인식 가능주어진 인스턴스)

    java.util.Arrays#asList()

    java.util.Collections#list()

    java.util.Collections#enumeration()

    java.io.InputStreamReader(InputStream)  ( Reader 를 반환 )

    java.io.OutputStreamWriter(OutputStream)  ( Writer 를 반환 )

    javax.xml.bind.annotation.adapters.XmlAdapter#marshal()  그리고 #unmarshal()

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

    아무도 생각 나지 않습니다. 가상의 예는 new LinkedHashMap(LinkedHashSet<K>, List<V>) 입니다.  항목을 복제하지는 않지만 수정할 수없는 수정 된 링크 맵을 반환합니다. 와이즈 비즈  그리고 java.util.Collections#newSetFromMap()  그러나 방법은 가까이 온다.

    복합(동일한추상/인터페이스 유형의 인스턴스를 트리 구조로 가져가는 행동 방법으로 인식 가능)

    singletonXXX()  (실제로 스윙 전체에서)

    java.awt.Container#add(Component)  (실제로 JSF UI 전체에서)

    데코레이터(추가 동작을 추가하는같은추상/인터페이스 유형의 인스턴스를 생성하는 생성 방법으로 인식 가능) javax.faces.component.UIComponent#getChildren() 의 모든 서브 클래스 java.io.InputStream OutputStream  그리고 Reader  동일한 유형의 인스턴스를 생성자가 생성합니다.

    Writer java.util.Collections checkedXXX()  그리고 synchronizedXXX()  방법.

    unmodifiableXXX()  그리고 javax.servlet.http.HttpServletRequestWrapper

    HttpServletResponseWrapper

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

    javax.swing.JScrollPane 내부적으로 추상/인터페이스 유형 javax.faces.context.FacesContext 를 사용합니다. LifeCycle ViewHandler  그리고 최종 사용자는 그것에 대해 걱정할 필요가 없습니다 (그러나 주입으로 무시할 수 있음).

    NavigationHandler 내부적으로 javax.faces.context.ExternalContext 를 사용하는 ServletContext HttpSession HttpServletRequest

    Flyweight(캐시 된 인스턴스를 반환하는 생성 방법으로 인식 가능, "멀티 톤"아이디어 조금)

    HttpServletResponse  (또한 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

    java.util.logging.Logger#log()

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

    javax.servlet.Filter#doFilter() 의 모든 구현

    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

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

    scheduleXXX()  (세터 메소드를 사용하면 java.lang.reflect.Method#invoke()  내부적으로 java.util.Date 로 표시됩니다  가치)

    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 에 의해 제어 됨 , 동작은 JSF 수명주기의 현재 단계 (상태)에 따라 다릅니다)

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

    javax.faces.lifecycle.LifeCycle#execute() FacesServlet 에 의해 실행 .

    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  기본적으로 메소드는 HTTP 405 "Method Not Allowed"오류를 응답으로 보냅니다. 당신은 그들 중 어느 것도 자유롭게 구현할 수 없습니다.

    방문자(각각기타추상/인터페이스 유형을 취하는 메소드가 정의 된 두 개의다른추상/인터페이스 유형으로 인식 가능;실제로는 다른 쪽의 메소드를 호출하고 다른 쪽은 원하는 전략을 실행합니다)

    javax.servlet.http.HttpServlet  그리고 doXXX()

    javax.lang.model.element.AnnotationValue  그리고 AnnotationValueVisitor

    javax.lang.model.element.Element  그리고 ElementVisitor

    javax.lang.model.type.TypeMirror  그리고 TypeVisitor

    java.nio.file.FileVisitor  그리고 SimpleFileVisitor

  • 답변 # 2

    전체 스윙에 걸친 관찰자 패턴 ( javax.faces.component.visit.VisitContext ) VisitCallback )

    MVC도 스윙 중

    어댑터 패턴 : InputStreamReader 및 OutputStreamWriter  참고 : Observable Observer ContainerAdapter ComponentAdapter FocusAdapter  어댑터가 아님;그것들은 실제로 널 오브젝트입니다. Sun의 이름 지정이 잘못되었습니다.

    데코레이터 패턴 ( KeyAdapter   MouseAdapter 와 같은 다른 스트림을 장식 할 수 있습니다 )

    AWT 툴킷 및 스윙 플러그 가능 룩앤필 클래스에 대한 AbstractFactory 패턴

    BufferedInputStream  싱글턴입니다

    FilterInputStream  중재자 패턴의 경우

    java.lang.Runtime#getRuntime() ButtonGroup  동일한 코드를 실행하기 위해 다른 시각적 표현에 사용될 수 있습니다->명령 패턴

    Flyweight 패턴을위한 JTable의 인턴 드 문자열 또는 CellRender (다양한 풀 (스레드 풀, 연결 풀, EJB 객체 풀-Flyweight는 실제로 공유 자원 관리에 관한 것)에 대해 생각합니다.

    자바 1.0과 같은 Java 1.0 이벤트 모델은 Chain of Responsibility의 예입니다.

    컬렉션 프레임 워크의 반복자 패턴

    AWT/Swing의 컨테이너는 복합 패턴을 사용합니다

    AWT/Swing의 레이아웃 관리자는 전략의 예입니다

    그리고 더 많은 것 같아요

  • 답변 # 3

    Flyweight는 Byte, Short, Integer, Long 및 String의 일부 값과 함께 사용됩니다.

    파사드는 여러 곳에서 사용되지만 가장 확실한 것은 스크립팅 인터페이스입니다.

    싱글턴-java.lang. 런타임이 떠 오릅니다.

    추상 팩토리-스크립팅 및 JDBC API

    명령-TextComponent의 실행 취소/다시 실행

    통역사-RegEx (java.util.regex.) 및 SQL (java.sql.) API

    시제품-이 숫자가 100 % 확실하지는 않지만 Action  이 방법으로이 방법을 사용할 수 있습니다.

  • 답변 # 4

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

    GoF에서 23 가지 패턴 중 하나를 인용 할 수 있을까요?

    <올>

    Abstract Factory : java.sql 인터페이스는 드라이버가 등록 될 때 JDBC JAR에서 구체적으로 구현됩니다.

    빌더 : java.lang.StringBuilder.

    공장 방법 : 무엇보다도 XML 팩토리.

    시제품 : 아마도 clone () 일지 모르겠지만 확실하지 않습니다

    싱글 톤 : java.lang.System

    어댑터 : java.awt.event의 어댑터 클래스 (예 : WindowAdapter)

    브리지 : java.util의 컬렉션 클래스. ArrayList로 구현 된 목록

    컴포지트 : java.awt. java.awt.Component + java.awt.Container

    데코레이터 : 모든 java.io 패키지

    Facade : ExternalContext는 쿠키, 세션 범위 및 유사한 작업을 수행하기위한 파사드로 동작합니다.

    비행 : 정수, 문자 등

    프록시 : java.rmi 패키지

    책임의 차이 : 서블릿 필터

    명령 : 스윙 메뉴 항목

    통역사 : JDK에서는 직접 사용할 수 없지만 JavaCC는이를 사용합니다.

    반복자 : java.util.Iterator 인터페이스;그보다 더 명확 할 수는 없습니다.

    중개자 : JMS?

    Memento :

    관찰자 : java.util.Observer/Observable (잘 못하지만)

    주 :

    전략 :

    템플릿 :

    방문자 :

    23 개 중 10 개에 대한 Java 예제는 생각할 수 없지만 내일 더 잘할 수 있는지 살펴 보겠습니다. 그것이 편집의 목적입니다.

  • 답변 # 5

    Abstract Factory 패턴은 다양한 장소에서 사용됩니다. 예 : AbstractAction clone() . 이름에 "Factory"라는 단어가있는 인터페이스에 대해 Javadoc을 검색하는 방법이 많이 있습니다.

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

    DatagramSocketImplFactory

  • 이전 javascript - ECMAScript 6 클래스 소멸자
  • 다음 bash - 서브 프로세스 (OS X)에서 실행될 때 컬러 그렙이 문제를 일으킴