주요 콘텐츠로 건너뛰기

CooLWJ 검색

选择搜索范围,输入关键词后按回车。

언어

JDK에는 어떤 디자인 패턴이 사용되었는가?

1,구조 패턴

1,어댑터 패턴

한 인터페이스를 다른 인터페이스로 변환하는 데 사용

java.util.Arrays#asList()

javax.swing.JTable(TableModel)

java.io.InputStreamReader(InputStream)

java.io.OutputStreamWriter(OutputStream)

javax.xml.bind.annotation.adapters.XmlAdapter#marshal()

javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal()

2,브리지 모드

이 패턴은 추상화와 추상 연산의 구현을 분리하여, 추상화와 구현이 독립적으로 변할 수 있게 합니다

AWT (네이티브 OS의 윈도 기능에 매핑되는 추상화 계층을 제공합니다.)

JDBC

3,컴포지트 패턴

클라이언트가 단일 객체와 객체의 조합을 동등하게 보도록 한다。다시 말해,어떤 타입의 메서드가 자신의 타입도 매개변수로 받는다

javax.swing.JComponent#add(Component)

java.awt.Container#add(Component)

java.util.Map#putAll(Map)

java.util.List#addAll(Collection)

java.util.Set#addAll(Collection)

4,데코레이터 패턴

객체에 추가 기능을 동적으로 부여하는 것으로, 서브클래스를 사용하는 방법의 대안이기도 합니다. 어떤 타입을 생성할 때 같은 타입의 객체도 함께 전달하는 것을 볼 수 있습니다. JDK 곳곳에서 볼 수 있으며, 어디에나 있다는 사실을 알게 될 것입니다. 따라서 아래 목록은 그중 극히 일부에 불과합니다

java.io.BufferedInputStream(InputStream)

java.io.DataInputStream(InputStream)

java.io.BufferedOutputStream(OutputStream)

java.util.zip.ZipOutputStream(OutputStream)

java.util.Collections#checked<list |sortedmap |sortedset |set |map>

5,퍼사드 패턴

컴포넌트、인터페이스、추상 요소 또는 하위 시스템의 집합에 간단한 인터페이스를 제공한다

java.lang.Class

javax.faces.webapp.FacesServlet

6,플라이웨이트 패턴

캐시를 사용하여 다수의 작은 객체에 대한 접근 시간을 단축한다

java.lang.Integer#valueOf(int)

java.lang.Boolean#valueOf(boolean)

java.lang.Byte#valueOf(byte)

java.lang.Character#valueOf(char)

7,프록시 패턴

프록시 패턴은 단순한 객체를 사용하여 복잡하거나 생성에 시간이 오래 걸리는 객체를 대신하는 것이다.

java.lang.reflect.Proxy

RMI


Java 커피잔과 조립 장면으로 소프트웨어 설계를 표현한 삽화

이,생성 패턴

1,추상 팩토리 패턴

추상 팩토리 패턴은 구체적인 객체의 타입을 지정하지 않고도 관련된 객체나 독립된 객체들을 일련으로 생성할 수 있는 규약을 제공한다. 이를 통해 애플리케이션은 사용하는 프레임워크의 구체적인 구현과 결합을 끊을 수 있다. JDK나 Spring 같은 여러 프레임워크에서 이를 쉽게 찾아볼 수 있다. 식별하기도 쉽다. 새 객체를 생성하는 메서드가 인터페이스나 추상 클래스를 반환한다면, 그것이 추상 팩토리 패턴이다

java.util.Calendar#getInstance()

java.util.Arrays#asList()

java.util.ResourceBundle#getBundle()

java.sql.DriverManager#getConnection()

java.sql.Connection#createStatement()

java.sql.Statement#executeQuery()

java.text.NumberFormat#getInstance()

javax.xml.transform.TransformerFactory#newInstance()

2,빌더 패턴(Builder)

복잡한 객체의 생성을 단순화하기 위해 다른 클래스의 인스턴스를 만드는 새로운 클래스를 정의한다. 빌더 패턴도 일반적으로 메서드 체이닝을 사용해 구현한다

java.lang.StringBuilder#append()

java.lang.StringBuffer#append()

java.sql.PreparedStatement

javax.swing.GroupLayout.Group#addComponent()

3,팩토리 메서드

바로 구체적인 객체를 반환하는 메서드다

java.lang.Proxy#newProxyInstance()

java.lang.Object#toString()

java.lang.Class#newInstance()

java.lang.reflect.Array#newInstance()

java.lang.reflect.Constructor#newInstance()

java.lang.Boolean#valueOf(String)

java.lang.Class#forName()

4,프로토타입 패턴

클래스의 인스턴스가 자신의 복사본을 생성할 수 있게 한다. 객체 인스턴스를 만드는 과정이 매우 복잡하고 시간이 많이 걸린다면 이 패턴을 사용할 수 있다. 새 인스턴스를 다시 생성하는 대신, 객체를 복사해 바로 수정하면 된다

java.lang.Object#clone()

java.lang.Cloneable

5,싱글턴 패턴

클래스의 인스턴스가 하나만 존재하도록 보장하는 데 사용합니다. Joshua Bloch는 Effetive Java에서 또 다른 방법으로 열거형을 사용할 것을 제안했습니다

java.lang.Runtime#getRuntime()

java.awt.Toolkit#getDefaultToolkit()

java.awt.GraphicsEnvironment#getLocalGraphicsEnvironment()

java.awt.Desktop#getDesktop()


셋,행위 패턴

1,책임 연쇄 패턴

요청이 처리될 때까지 한 객체에서 체인의 다음 객체로 요청을 전달하는 방식으로 객체 간 결합을 해소

java.util.logging.Logger#log()

javax.servlet.Filter#doFilter()

2,명령 모드

작업을 객체 안에 캡슐화하여 저장,전달 및 반환할 수 있게 한다

java.lang.Runnable

javax.swing.Action

3,인터프리터 패턴

이 패턴은 보통 언어의 문법을 정의한 다음, 해당 문법에 맞는 문장을 해석합니다.

java.util.Pattern

java.text.Normalizer

java.text.Format

4,이터레이터 패턴

기반 컬렉션의 구체적인 구현과 관계없이,컬렉션 안의 객체에 순서대로 접근할 수 있는 일관된 방법을 제공합니다

java.util.Iterator

java.util.Enumeration

5,중재자 패턴

중간 객체를 사용하여 메시지를 분배하고 클래스 간의 직접적인 의존성을 줄인다

java.util.Timer

java.util.concurrent.Executor#execute()

java.util.concurrent.ExecutorService#submit()

java.lang.reflect.Method#invoke()

6,메멘토 패턴

객체 상태의 스냅샷을 생성하여 객체가 자신의 내부 내용을 노출하지 않고 원래 상태로 복원할 수 있게 한다. Date 객체는 내부의 long 값 하나를 통해 메멘토 패턴을 구현한다

java.util.Date

java.io.Serializable

7,널 객체 패턴

이 패턴은 의미 없는 객체로 객체가 없는 상태를 대신합니다. 이를 통해 널 객체를 별도로 처리할 필요가 없어집니다

java.util.Collections#emptyList()

java.util.Collections#emptyMap()

java.util.Collections#emptySet()

8,옵서버 패턴

이를 통해 객체는 관심 있는 객체에 유연하게 메시지를 보낼 수 있다

java.util.EventListener

javax.servlet.http.HttpSessionBindingListener

javax.servlet.http.HttpSessionAttributeListener

javax.faces.event.PhaseListener

9,상태 패턴

객체 내부의 상태를 바꾸어,실행 중에 객체의 동작을 동적으로 변경할 수 있게 한다

java.util.Iterator

javax.faces.lifecycle.LifeCycle#execute()

10,전략 패턴

이 패턴을 사용해 알고리즘들을 일련의 객체로 캡슐화한다. 이 객체들을 전달함으로써 프로그램의 기능을 유연하게 바꿀 수 있다

java.util.Comparator#compare()

javax.servlet.http.HttpServlet

javax.servlet.Filter#doFilter()

11,템플릿 메서드 패턴

하위 클래스가 메서드 전체가 아닌 일부만 재정의하도록 하여, 하위 클래스가 어떤 연산을 재정의해야 하는지 제어할 수 있다

java.util.Collections#sort()

java.io.InputStream#skip()

java.io.InputStream#read()

java.util.AbstractList#indexOf()

12,방문자 패턴

객체 집합을 조작할 수 있는 편리하고 유지보수하기 쉬운 방법을 제공한다。조작 대상 객체를 변경하지 않고도 객체의 동작을 수정하거나 확장할 수 있게 한다

javax.lang.model.element.Element 및 javax.lang.model.element.ElementVisitor

javax.lang.model.type.TypeMirror 및 javax.lang.model.type.TypeVisitor

옮긴이 주: 여러 부분에서 논란이 있을 수 있다. 특정 패턴에 해당하는지는 사실 그리 중요하지 않다. 중요한 것은 이러한 설계가 코드를 개선하는 데 참고할 경험을 제공한다는 점이다


댓글

보내는 중

원하는 테마를 선택하세요

선택한 테마가 사이트 전체에 적용됩니다.