jdk 에서 사용 하 는 몇 가지 디자인 모델

5226 단어
디자인 모델 은 소프트웨어 공학 분야 에서 매우 관건 적 인 주제 이다.모든 사람들 은 그것들 을 점점 더 깊이 배우 고 싶 어 한다.GOF 책 등 많은 문헌 을 사용 할 수 있다.우 리 는 책 에서 개념 해석 과 디자인 모델 예제 에 관 한 예 를 대량으로 찾 을 수 있 지만 모델 정의 와 표준 용법 이 JDK 소스 코드 에서 의 표현 을 쓰 고 싶 습 니 다.
단일 모드
하나의 인 스 턴 스 만 만 들 고 대상 에 게 전역 접근 점 을 제공 하도록 확보 합 니 다.
예 를 들 면:
  • java.lang.Runtime#getRuntime()
  •     private static Runtime currentRuntime = new Runtime();
        
       public static Runtime getRuntime() {
           return currentRuntime;
        }
    
  • java.awt.Desktop#getDesktop()
  •   /**
         * Returns the Desktop instance of the current
         * browser context.  On some platforms the Desktop API may not be
         * supported; use the {@link #isDesktopSupported} method to
         * determine if the current desktop is supported.
         * @return the Desktop instance of the current browser context
         * @throws HeadlessException if {@link
         * GraphicsEnvironment#isHeadless()} returns {@code true}
         * @throws UnsupportedOperationException if this class is not
         * supported on the current platform
         * @see #isDesktopSupported()
         * @see java.awt.GraphicsEnvironment#isHeadless
         */
        public static synchronized Desktop getDesktop(){
            if (GraphicsEnvironment.isHeadless()) throw new HeadlessException();
            if (!Desktop.isDesktopSupported()) {
                throw new UnsupportedOperationException("Desktop API is not " +
                                                        "supported on the current platform");
            }
    
            sun.awt.AppContext context = sun.awt.AppContext.getAppContext();
            Desktop desktop = (Desktop)context.get(Desktop.class);
    
            if (desktop == null) {
                desktop = new Desktop();
                context.put(Desktop.class, desktop);
            }
    
            return desktop;
        }
    

    공장 모드
    실제 논 리 를 클 라 이언 트 에 노출 시 키 지 않 고 공공 인 터 페 이 스 를 통 해 새로 만 든 대상 을 참조 합 니 다.
    예 를 들 면:
  • java. lang. Object \ # toString () (모든 하위 클래스 에서 다시 쓰기)
  • java.lang.Class#newInstance()
  • java.lang.Integer#valueOf(String)
  • java.lang.Class#forName()
  • java.lang.reflect.Array#newInstance()
  • java.lang.reflect.Constructor#newInstance()

  • 추상 공장
    클래스 를 명시 적 으로 지정 하지 않 고 관련 대상 을 만 드 는 데 사용 할 인 터 페 이 스 를 제공 합 니 다.우 리 는 그것 이 공장 모델 의 더욱 높 은 차원 의 추상 이 라 고 간단하게 말 할 수 있다.
    예 를 들 면:
  • java.util.Calendar#getInstance()
  • java.util.Arrays#asList()
  • java.util.ResourceBundle#getBundle()
  • java.net.URL#openConnection()
  • java.sql.DriverManager#getConnection()
  • java.sql.Connection#createStatement()
  • java.sql.Statement#executeQuery()
  • java.text.NumberFormat#getInstance()
  • java. lang. management. Management Factory (모든 getXXX () 방법)
  • java.nio.charset.Charset#forName()
  • javax.xml.parsers.DocumentBuilderFactory#newInstance()
  • javax.xml.transform.TransformerFactory#newInstance()
  • javax.xml.xpath.XPathFactory#newInstance()

  • 관찰자 모드
    대상 간 의 다 중 의존 관 계 를 정의 하고 도시락 대상 이 상 태 를 변경 할 때 모든 의존 항목 을 자동 으로 알 리 고 업데이트 합 니 다.
    예 를 들 면:
  • java.util.Observer/java.util.Observable
  • java. util. EventListener 의 모든 실현 클래스
  • javax.servlet.http.HttpSessionBindingListener
  • javax.servlet.http.HttpSessionAttributeListener
  • javax.faces.event.PhaseListener

  • 구조 자 모드
    대상 을 만 드 는 데 사용 할 인 스 턴 스 를 정의 하지만 하위 클래스 가 어떤 종 류 를 예화 할 지 결정 하고 구조 과정 을 잘 제어 할 수 있 도록 합 니 다.가장 간단 한 구축 기 는 공장 모델 과 유사 하 다 고 할 수 있 습 니 다. Builder 는 생 성 대상 의 옵션 을 제공 할 수 있 습 니 다.
    예 를 들 면:
  • java.lang.StringBuilder#append() (unsynchronized)
  • java.lang.StringBuffer#append() (synchronized)
  • java. nio. ByteBuffer \ # put () (그리고 CharBuffer, Short Buffer, IntBuffer, LongBuffer, Float Buffer, DoubleBuffer)
  • javax.swing.GroupLayout.Group#addComponent()
  • java. lang. Appendable 의 실현 클래스
  • 원형 모형
    프로 토 타 입 인 스 턴 스 를 사용 하여 만 들 대상 형식 을 지정 하고 이 프로 토 타 입 을 복사 하여 새 대상 을 만 듭 니 다.
    예 를 들 면:
  • java. lang. Object \ # clone () (클래스 는 java. lang. Cloeable 을 실현 해 야 합 니 다)
  • 책임 체인 모드
    그것 은 요청 한 발송 자 를 수신 자 에 게 추가 하 는 것 을 피하 고 다른 대상 도 요청 을 처리 할 수 있 게 한다.
    대상 은 체인 의 일부분 이 되 어 한 대상 에서 다른 대상 으로 보 내 고 그 중의 한 대상 이 처리 할 때 까지 요청 합 니 다.
    예 를 들 면:
  • java.util.logging.Logger#log()
  • javax.servlet.Filter#doFilter()

  • 다음으로 전송:https://juejin.im/post/5cbfdb406fb9a0322c428f2c

    좋은 웹페이지 즐겨찾기