Design Pattern

정의

UML과 같은 일종의 설계 기법이며, 설계방법이다.

SW 설계에서 발생할 수 있는 문제들을 해결해온 전문가들의 경험을 모아 정리한 것이다.

목적

SW 설계시 SW 재사용성, 호환성, 유지보수성을 보장하여 '올바른 설계'를 빠르게 만들 수 있게 함.

구성요소

이름

 설계 문제와 해법을 서술

 문제

 해결할 문제와 그 배경을 설명

 해법

 설계를 구성하는 요소들과 그 요소들 간의 관계, 책임 그리고 협력 관계 서술

 결과

 디자인 패턴을 적용해서 얻은 결과와 장단점을 서술


원칙

 SRP

 객체는 둘 이상의 책임을 갖지 않게 한다.

 OCP

 클래스 확장에 대해서는 열려 있으나 변경에 대해서는 닫혀 있다.

 LSP

 자식 타입은 부모 타입이 사용되는 곳에 대체 가능

 자식 클래스는 부모의 책임을 넘지 말고 자식 기능 제약 필요.

 ISP

 인터페이스를 구체적으로 분리

 DIP 

 의존성 역전

 구현 클래스에 의존하지 말고 추상화된 클래스에 의존

구현이 아닌 인터페이스에 맞춰서 프로그래밍 – 상위형식에 맞춰 프로그래밍

상속보다 위임(delegation)을 활용

바뀌는 부분은 캡슐화

분류

목적

생성 패턴

Creation Pattern

구조 패턴

Structural Pattern

행위 패턴

Behavioral Pattern

의미

객체의 생성방식을 결정하는 패턴

객체를 조직화하는데 유용한 패턴

객체의 행위를 조직, 관리, 연합하는데 사용하는 패턴

범위

클래스

Factory method

Adapter

Template method

Interpreter

객체

Abstract factory

Builder

Singleton

Prototype

Bridge

Composite

Decorator

Facade

Fly weight

Proxy

Command

Iterator

Mediator

Memento

Observer

State

Strategy

Visitor

Chain of Responsibility

클래스 패턴: 클래스 간의 관계가 상속을 통하여 정의. 컴파일 시점에 정적으로 결정.

객체 패턴: 객체 간의 관계를 다루며 객체 사이의 관계는 보통 구성을 통해 정의. 실행 중에 관계가 생성되어 더 동적이며 유연하다.


생성 패턴

1. Factory method 

구체적인 처리를 서브클래스로 미룸

대행함수를 통한 객체 생성

객체 생성을 위한 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할지를 서브클래스가 한다. 동일한 역할은 하지만 다른 클래스의 객체를 생성.


2. 추상 팩토리(Abstract factory)

제품 객체군

구체적인 클래스를 지정하지 않고 관련성을 갖는 객체들의 집합을 생성.

서로 독립적인 객체들의 집합을 생성할 수 있는 인터페이스 제공.


3. Builder

복합 객체 생성. buildPart()

복합 객체의 생성과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 함. 복잡한 객체의 단계별 생성


4. Signleton

단 하나의 인스턴스 (전역변수)

오직 하나의 클래스 인스턴스만 만들어지도록 하고, 이에 대한 전역적인 접근을 제공. (Static method)


5. Prototype

복사패턴. 인스턴스를 복사하여 새로운 객체 생성. clone(), copy()

프로토타입 인스턴스를 이용해 생성할 객체의 종류를 명세하고 이 프로토타입을 복사해 새로운 객체 생성.


구조 패턴

1. Adapter

Wrapper 패턴. 한 겹 싸서 재사용.

서로 일치하지 않는 인터페이스를 갖는 클래스들을 함께 동작시킴

기존 클래스가 제공하는 인터페이스를 다른 클래스가 필요로 하는 인터페이스로 변환할 때 사용.


어댑터를 만드는 방법

상속 – 클래스 패턴

위임 – 객체 패턴


2. Bridge

추상화(또는 인터페이스)와 구현을 분리하여 각각을 독립적으로 변형 가능

구현 자체도 하나의 추상화 개념으로 다양한 변형이 가능.

구현과 독립적으로 인터페이스도 다양함을 가질 수 있다.


3. Composite

부분-전체, 복합 객체

부분-전체(Part-whole hierarchy) 계층을 나타내기 위해 복합 객체를 트리구조로 만듬.


4. Decorator

객체에 동적으로 기능을 추가, 삭제

기능의 유연한 확장을 위해 상속 대신 사용.


5. Façade

서브시스템에 있는 인터페이스 집합에 대하여 하나의 통합된 인터페이스를 제공. (JDBC, ODBC)

복잡한 서브시스템에 대한 단순한 인터페이스 제공.

서브시스템을 쉽게 사용하기 위한 포괄적인 개념의 인터페이스 정의.


6. Fly weight

핵심적인 부분과 부수적인 부분으로 나누어 객체를 잘개 쪼개려(fine-grained)할 때

작은 크기의 객체들이 여러 개 있을 때 공유를 통해 효과적으로 지원.


7. Proxy 접근제어

다른 객체로의 접근을 통제하기 위해서 대리자를 제공. (큰 이미지 로딩, 통신 연결 시 응답 대기)


종류

 설명

 원격지 프록시

 서로 다른 주소 공간에 존재하는 객체에 대한 지역적 표현

 가상 프록시

 요청이 있을 때만 필요한 객체를 생성한다. 실제 대상에 접근 지연

 보호용 프록시

 원래 객체에 대한 실제 접근을 제


행위 패턴

1. Interpreter

언어에 때라 문법에 대한 표현을 정의

언어의 문장을 해석하기 위해 분석기를 정의

추상 구문 트리는 composite 패턴의 인스턴스


2. Template method 

상위 클래스에서 처리의 뼈대를 결정하고 하위 클래스에서 그 구체적인 내용을 결정.

알고리즘 처리과정의 변경 없이 알고리즘의 각 단계의 세부 내용을 서브클래스에서 재정의

재정의 가능한 메소드를 hook 메소드라고 함.


3. Command

요청을 객체로 캡슐화하여 서로 다른 요청으로 클라이언트를 파라미터화하고, 요청을 저장하거나 기록에 남겨서 오퍼레이션의 취소도 가능. (자바 리스너)


4. 반복자 (Iterator)

동일 객체의 순차적 접근

집단 객체의 내부표현을 노출하지 않고 집단 객체의 요소를 순차적으로 접근

유사한 객체들의 집단을 다루어야 할 경우 동일한 방법(인터페이스)으로 객체를 다루게 한다.

composite 패턴의 객체를 탐색할 때 사용


5. 중재자(Mediator)

M: N -> M:1

서로 관련된 객체들 간의 상호작용()을 객체로 캡슐화.

즉, 객체들 간의 참조관계를 객체에서 분리함으로써 상호작용만을 독립적으로 다양하게 확대.

M: N 객체 간계를 M:1로 단순화.


6. 메멘토(Memento)

상태를 보존

캡슐화를 위반하지 않고 객체의 내부상태를 객체화하여 나중에 객체를 이전 상태로 복구 가능하게 함

command 패턴에서 취소가 가능한 오퍼레이션의 상태를 저장할 때 사용.


7. 감시자(Observer)

상태의 변화를 통지 및 변경. 1:N

한 객체가 상태를 변화시킬 때 의존관계에 있는 다른 객체들에게 자동적으로 통지 및 변경 (notify & update)

Publish & Subscribe 스타일 적용 시 사용


8. 상태(State)

객체의 내부상태에 따라 행위를 변경할 수 있게 함.

객체 상태 추가 시 행위수행의 원활한 변경이 가능.


9. 전략(Strategy)

알고리즘군이 존재할 때 각각의 알고리즘을 별도의 클래스로 캡슐화하고 이들을 상호교환이 가능한 것으로 정의

클라이언트에 영향을 주지 않고 독립적으로 알고리즘을 변경.

알고리즘의 구현과 선택을 분리.

동일 목적의 여러 알고리즘 중 선택해서 적용 가능.


10. 방문자(Visitor)

오퍼레이션이 처리할 요소의 클래스를 변경하지 않고도 새로운 오퍼레이션을 정의

작업 종류의 효율적 추가 및 변경

작업 대상이 되는 클래스 구조는 확장될 가능성이 없는 대신, 수행할 작업항목은 계속해서 추가, 확장될 여지가 많을 경우


11. 책임의 연쇄(Chain of responsibility)

어떤 요청이 발생했을 때 이를 처리할 객체를 바로 결정할 수 없을 경우 여러 객체를 사슬처럼 연결하고 요청을 해결할 객체를 만날 때까지 객체의 사슬을 따라서 요청을 전달한다.

트리의 모든 노드 방문

(여러 종류의 은행 계좌에 대해 고객별 입금 총액을 계산해 주거나 입출금 내역을 조회하는 작업 등을 쉽게 처리해 줄 수 있게 함.)

+ Recent posts

티스토리 툴바