GoF 디자인 패턴: Difference between revisions

From IT위키
No edit summary
No edit summary
Line 3: Line 3:
4명의 컴퓨터 공학자<ref>에리히 감마(Erich Gamma), 리처드 헬름(Richard Helm), 랄프 존슨(Ralph Johnson), 존 블리시데스(John Vlissides)</ref>에 의해 3개 분류 23가지로 정리된 [[소프트웨어 디자인 패턴]]
4명의 컴퓨터 공학자<ref>에리히 감마(Erich Gamma), 리처드 헬름(Richard Helm), 랄프 존슨(Ralph Johnson), 존 블리시데스(John Vlissides)</ref>에 의해 3개 분류 23가지로 정리된 [[소프트웨어 디자인 패턴]]


== 구분 ==
==구분==


==== 생성(Creational Pattern) ====
====생성(Creational Pattern)====


* 객체를 생성하는데 관련된 패턴들
*객체를 생성하는데 관련된 패턴들
* 객체가 생성되는 과정의 유연성을 높이고 코드의 유지를 쉽게 함
*객체가 생성되는 과정의 유연성을 높이고 코드의 유지를 쉽게 함


==== 구조(Structural Pattern) ====
====구조(Structural Pattern)====


* 프로그램 구조에 관련된 패턴들
*프로그램 구조에 관련된 패턴들
* 프로그램 내의 자료구조나 인터페이스 구조 등 프로그램의 구조를 설계하는데 활용할 수 있는 패턴들
*프로그램 내의 자료구조나 인터페이스 구조 등 프로그램의 구조를 설계하는데 활용할 수 있는 패턴들


==== 행위(Behavioral Pattern) ====
====행위(Behavioral Pattern)====


* 반복적으로 사용되는 객체들의 상호작용을 패턴화 해놓은 것들
*반복적으로 사용되는 객체들의 상호작용을 패턴화 해놓은 것들


== 23개 디자인 패턴 ==
==23개 디자인 패턴==
{| class="wikitable"
{| class="wikitable"
! colspan="2" rowspan="2" |디자인패턴
! colspan="2" rowspan="2" |디자인패턴
Line 33: Line 33:
!클래스
!클래스
|
|
* Factory Method
*Factory Method
|
|
* Adaptor
*Adaptor
|
|
* Interpreter
*Interpreter


* Template Method
*Template Method
|-
|-
!객체
!객체
|
|
* Abstract Factory
*Abstract Factory
* Builder
*Builder
* Prototype
*Prototype
* Singleton
*Singleton
|
|
* Adaptor
*Adaptor
* Bridge
*Bridge
* Composite
*Composite
* Decorator
*Decorator
* Façade
*Façade
* Flyweight
*Flyweight
* Proxy
*Proxy
|
|
* Chain of Responsibility
*Chain of Responsibility
* Command
*Command
* Iterator
*Iterator
* Mediator
*Mediator
* Memento
*Memento
* Observer
*Observer
* State
*State
* Strategy
*Strategy
* Visitor
*Visitor
|}
|}
===생성 패턴===


== 종류 ==
=== 생성 패턴 ===
;Creational Pattern
;Creational Pattern


==== 추상 팩토리 ====
==== 팩토리 메소드 ====
 
;;Factory Method
;*Virtual-Constructor 패턴이라고도 함
;*객체를 생성하기 위한 인터페이스를 정의 하여 어떤 클래스가 인스턴스화 될 것인지는 서브클래스가 결정
 
====추상 팩토리====
 
;Abstract Factory
;Abstract Factory
* 구체적인 클래스에 의존하지 않고, 서로 연관·의존하는 객체들의 그룹으로 생성하여 추상적으로 표현
* 연관된 서브 클래스를 묶어 한 번에 교체 가능


==== 빌더 ====
*구체적인 클래스에 의존하지 않고, 서로 연관·의존하는 객체들의 그룹으로 생성하여 추상적으로 표현
*연관된 서브 클래스를 묶어 한 번에 교체 가능
 
====빌더====
 
;Builder
;Builder
* 건축가가 블록을 조립하는 모습
* 분리된 인스턴스(객체)를 건축하듯이 조합하여 객체를 생성
* 동일한 객체 생성에서도 다른 결과 나올 수 있음


==== 팩토리 메소드 ====
*건축가가 블록을 조립하는 모습
;Factory Method
*분리된 인스턴스(객체)를 건축하듯이 조합하여 객체를 생성
* Virtual-Constructor 패턴이라고도 함
*동일한 객체 생성에서도 다른 결과 나올 수 있음
* 객체를 생성하기 위한 인터페이스를 정의 하여 어떤 클래스가 인스턴스화 될 것인지는 서브클래스가 결정
 
====프로토타입====


==== 프로토타입 ====
;Prototype
;Prototype
* 원본 객체를 복제하는 방법으로 객체를 생성하는 패턴
* 비용이 큰 경우 주로 이용


==== 싱글톤 ====
*원본 객체를 복제하는 방법으로 객체를 생성하는 패턴
*비용이 큰 경우 주로 이용
 
====싱글톤====
 
;Singleton
;Singleton
* 객체를 어디서든 참조할 수 있지만, 여러 프로세스가 동시에 참조하는 것은 불가능
* 인스턴스가 하나뿐이기 때문에 불필요한 메모리 낭비를 최소화 할 수 있음


=== 구조 패턴 ===
*객체를 어디서든 참조할 수 있지만, 여러 프로세스가 동시에 참조하는 것은 불가능
*인스턴스가 하나뿐이기 때문에 불필요한 메모리 낭비를 최소화 할 수 있음
 
===구조 패턴===
 
;Structural Pattern
;Structural Pattern


==== 어댑터 ====
====어댑터====
 
;Adaptor
;Adaptor
* 호환성을 맞춰주는 변압기
* 클래스들의 호환성이 맞도록 변환해주는 패턴
* 기존의 클래스를 이용하고 싶은데 인터페이스가 일치하지 않을 때 사용


==== 브리지 ====
*호환성을 맞춰주는 변압기
*클래스들의 호환성이 맞도록 변환해주는 패턴
*기존의 클래스를 이용하고 싶은데 인터페이스가 일치하지 않을 때 사용
 
====브리지====
 
;Bridge
;Bridge
* 두 섬을 연결하는 다리
* 서로가 독립적으로 확장할 수 있도록 구성한 패턴
* 기능과 구현을 별도의 클래스에서 구현


==== 컴포지트 ====
*두 섬을 연결하는 다리
;Composite  
*서로가 독립적으로 확장할 수 있도록 구성한 패턴
* 폴더와 파일을 합성한 것
*기능과 구현을 별도의 클래스에서 구현
* 복합 객체와 단일 객체를 구분 없이 다루고자 할 때 사용
 
* 복합 객체 안에 복합 객체가 포함되는 구조 구현 가능
====컴포지트====
 
;Composite
 
*폴더와 파일을 합성한 것
*복합 객체와 단일 객체를 구분 없이 다루고자 할 때 사용
*복합 객체 안에 복합 객체가 포함되는 구조 구현 가능
 
====데코레이터====


==== 데코레이터 ====
;Decorator
;Decorator
* 온갖 것으로 장식된 눈사람
* 객체 간의 결합으로 기능을 확장할 수 있음
* 부가적인 기능 추가를 위해 다른 객체들을 덧붙이는 방식


==== 퍼싸드 ====
*온갖 것으로 장식된 눈사람
*객체 간의 결합으로 기능을 확장할 수 있음
*부가적인 기능 추가를 위해 다른 객체들을 덧붙이는 방식
 
====퍼싸드====
 
;Facade
;Facade
* 리모컨만으로 복잡한 명령을 수행하는 것
* 상위에 인터페이스를 구성하여 서브 클래스들의 기능을 수행할 수 있음
* 서브 클래스들 사이의 통합 인터페이스를 제공하는 Wrapper 객체 필요


==== 플라이웨이트 ====
*리모컨만으로 복잡한 명령을 수행하는 것
*상위에 인터페이스를 구성하여 서브 클래스들의 기능을 수행할 수 있음
*서브 클래스들 사이의 통합 인터페이스를 제공하는 Wrapper 객체 필요
 
====플라이웨이트====
 
;Flyweight
;Flyweight
* 부담을 가볍게 하기 위해 물품 공유
* 인스턴스를 가능한 공유해서 사용하여 메모리를 절약
* 다수의 유사 객체를 생성하거나 조작할 때 유용함


==== 프록시 ====
*부담을 가볍게 하기 위해 물품 공유
*인스턴스를 가능한 공유해서 사용하여 메모리를 절약
*다수의 유사 객체를 생성하거나 조작할 때 유용함
 
====프록시====
 
;Proxy
;Proxy
* 하기 어려운 업무를 대리로 해주는 사람
* 접근이 어려운 객체와 여기 접근하려는 객체 사이의 인터페이스 역할
* 네트워크 연결, 메모리의 대용량 객체로의 접근에 이용


=== 행위 패턴 ===
*하기 어려운 업무를 대리로 해주는 사람
*접근이 어려운 객체와 여기 접근하려는 객체 사이의 인터페이스 역할
*네트워크 연결, 메모리의 대용량 객체로의 접근에 이용
 
===행위 패턴===
 
;Behavioral Pattern
;Behavioral Pattern


==== 책임 연쇄 ====
====책임 연쇄====
 
;Chain of Responsibility
;Chain of Responsibility
* 연속해서 나눠받는 물레방아
* 한 객체가 처리하지 못하면 다음 객체로 넘어가는 패턴
* 요청이 해결될 때까지 고리를 따라 책임이 넘어감


==== 커맨드 ====
*연속해서 나눠받는 물레방아
*한 객체가 처리하지 못하면 다음 객체로 넘어가는 패턴
*요청이 해결될 때까지 고리를 따라 책임이 넘어감
 
====커맨드====
 
;Command
;Command
* 명령어를 하나로 합쳐둔 것
* 요청을 캡슐화하여 재이용하거나 취소할 수 있도록 저장하거나 로그로 남김
* 추상클래스와 구체클래스로 나뉨


==== 인터프리터 ====
*명령어를 하나로 합쳐둔 것
*요청을 캡슐화하여 재이용하거나 취소할 수 있도록 저장하거나 로그로 남김
*추상클래스와 구체클래스로 나뉨
 
====인터프리터====
 
;Interpreter
;Interpreter
* 언어 번역가
* 언어에 문법 표현을 정의함
* SQL이나 통신 프로토콜에 사용


==== 반복자 ====
*언어 번역가
*언어에 문법 표현을 정의함
*SQL이나 통신 프로토콜에 사용
 
====반복자====
 
;Iterator
;Iterator
* 같은 명령의 반복
* 접근이 잦은 객체에 대해 동일한 인터페이스를 사용하도록 함
* 내부 표현 방법의 노출 없이 순차적인 접근 가능


==== 중재자 ====
*같은 명령의 반복
*접근이 잦은 객체에 대해 동일한 인터페이스를 사용하도록 함
*내부 표현 방법의 노출 없이 순차적인 접근 가능
 
====중재자====
 
;Mediator
;Mediator
* 매매를 중개해주는 중개사이트
* 객체들 간의 복잡한 상호작용을 캡슐화하여 객체로 정의
* 객체 사이의 결합도를 감소시킴


==== 메멘토 ====
*매매를 중개해주는 중개사이트
*객체들 간의 복잡한 상호작용을 캡슐화하여 객체로 정의
*객체 사이의 결합도를 감소시킴
 
====메멘토====
 
;Memento
;Memento
* 기억 속의 그 때로 돌아감.
* 객체를 특정 시점의 상태로 돌릴 수 있는 기능
* ctrl+z 와 같은 기능 개발시 사용


==== 옵서버 ====
*기억 속의 그 때로 돌아감.
*객체를 특정 시점의 상태로 돌릴 수 있는 기능
*ctrl+z 와 같은 기능 개발시 사용
 
====옵서버====
 
;Observer
;Observer
* 변화를 지켜보고 알려주는 것
* 한 객체의 상태 변화시 상속되어 있는 다른 객체들에게 알림
* 시스템간에 이벤트를 생성하고 수신할 때 사용


==== 상태 ====
*변화를 지켜보고 알려주는 것
*한 객체의 상태 변화시 상속되어 있는 다른 객체들에게 알림
*시스템간에 이벤트를 생성하고 수신할 때 사용
 
====상태====
 
;State
;State
* 상태에 따라 다른 방법을 사용함
* 객체의 상태에 따라 동일한 동작을 다르게 처리해야 할 때 사용
* 객체 상태를 캡슐화하고 이를 참조함


==== 전략 ====
*상태에 따라 다른 방법을 사용함
*객체의 상태에 따라 동일한 동작을 다르게 처리해야 할 때 사용
*객체 상태를 캡슐화하고 이를 참조함
 
====전략====
 
;Strategy
;Strategy
* 여러 전략을 정하고 필요할 때 선택하여 씀
* 동일한 계열의 알고리즘을 캡슐화하여 상호 교환할 수 있게 정의함
* 원하는 알고리즘을 선택하여 사용하며 클라이언트에 영향 없이 알고리즘 변경 가능


==== 템플릿 메소드 ====
*여러 전략을 정하고 필요할 때 선택하여 씀
*동일한 계열의 알고리즘을 캡슐화하여 상호 교환할 수 있게 정의함
*원하는 알고리즘을 선택하여 사용하며 클라이언트에 영향 없이 알고리즘 변경 가능
 
====템플릿 메소드====
 
;Template Method
;Template Method
* 방법들을 큰 틀로 묶는 것
* 상위 클래스에서 골격 정의, 하위 클래스에서 세부 처리를 구체화
* 유사한 서브 클래스의 공통된 내용을 상위 클래스에서 정의(유지보수를 용이하게 함)


==== 방문자 ====
*방법들을 큰 틀로 묶는 것
*상위 클래스에서 골격 정의, 하위 클래스에서 세부 처리를 구체화
*유사한 서브 클래스의 공통된 내용을 상위 클래스에서 정의(유지보수를 용이하게 함)
 
====방문자====
 
;Visitor
;Visitor
* 책을 만들기 위해 저자, 편집자를 번갈아가며 방문
 
* 각 클래스들의 데이터 구조에서 처리 기능을 별도의 클래스로 구성
*책을 만들기 위해 저자, 편집자를 번갈아가며 방문
* 분리된 기능은 각 클래스를 방문하여 수행
*각 클래스들의 데이터 구조에서 처리 기능을 별도의 클래스로 구성
*분리된 기능은 각 클래스를 방문하여 수행
<references />

Revision as of 15:21, 9 August 2021

Gang of Four Design Pattern

4명의 컴퓨터 공학자[1]에 의해 3개 분류 23가지로 정리된 소프트웨어 디자인 패턴

구분

생성(Creational Pattern)

  • 객체를 생성하는데 관련된 패턴들
  • 객체가 생성되는 과정의 유연성을 높이고 코드의 유지를 쉽게 함

구조(Structural Pattern)

  • 프로그램 구조에 관련된 패턴들
  • 프로그램 내의 자료구조나 인터페이스 구조 등 프로그램의 구조를 설계하는데 활용할 수 있는 패턴들

행위(Behavioral Pattern)

  • 반복적으로 사용되는 객체들의 상호작용을 패턴화 해놓은 것들

23개 디자인 패턴

디자인패턴

영역

목적
생성 구조 행위
범위 클래스
  • Factory Method
  • Adaptor
  • Interpreter
  • Template Method
객체
  • Abstract Factory
  • Builder
  • Prototype
  • Singleton
  • Adaptor
  • Bridge
  • Composite
  • Decorator
  • Façade
  • Flyweight
  • Proxy
  • Chain of Responsibility
  • Command
  • Iterator
  • Mediator
  • Memento
  • Observer
  • State
  • Strategy
  • Visitor

생성 패턴

Creational Pattern

팩토리 메소드

Factory Method
  • Virtual-Constructor 패턴이라고도 함
  • 객체를 생성하기 위한 인터페이스를 정의 하여 어떤 클래스가 인스턴스화 될 것인지는 서브클래스가 결정

추상 팩토리

Abstract Factory
  • 구체적인 클래스에 의존하지 않고, 서로 연관·의존하는 객체들의 그룹으로 생성하여 추상적으로 표현
  • 연관된 서브 클래스를 묶어 한 번에 교체 가능

빌더

Builder
  • 건축가가 블록을 조립하는 모습
  • 분리된 인스턴스(객체)를 건축하듯이 조합하여 객체를 생성
  • 동일한 객체 생성에서도 다른 결과 나올 수 있음

프로토타입

Prototype
  • 원본 객체를 복제하는 방법으로 객체를 생성하는 패턴
  • 비용이 큰 경우 주로 이용

싱글톤

Singleton
  • 객체를 어디서든 참조할 수 있지만, 여러 프로세스가 동시에 참조하는 것은 불가능
  • 인스턴스가 하나뿐이기 때문에 불필요한 메모리 낭비를 최소화 할 수 있음

구조 패턴

Structural Pattern

어댑터

Adaptor
  • 호환성을 맞춰주는 변압기
  • 클래스들의 호환성이 맞도록 변환해주는 패턴
  • 기존의 클래스를 이용하고 싶은데 인터페이스가 일치하지 않을 때 사용

브리지

Bridge
  • 두 섬을 연결하는 다리
  • 서로가 독립적으로 확장할 수 있도록 구성한 패턴
  • 기능과 구현을 별도의 클래스에서 구현

컴포지트

Composite
  • 폴더와 파일을 합성한 것
  • 복합 객체와 단일 객체를 구분 없이 다루고자 할 때 사용
  • 복합 객체 안에 복합 객체가 포함되는 구조 구현 가능

데코레이터

Decorator
  • 온갖 것으로 장식된 눈사람
  • 객체 간의 결합으로 기능을 확장할 수 있음
  • 부가적인 기능 추가를 위해 다른 객체들을 덧붙이는 방식

퍼싸드

Facade
  • 리모컨만으로 복잡한 명령을 수행하는 것
  • 상위에 인터페이스를 구성하여 서브 클래스들의 기능을 수행할 수 있음
  • 서브 클래스들 사이의 통합 인터페이스를 제공하는 Wrapper 객체 필요

플라이웨이트

Flyweight
  • 부담을 가볍게 하기 위해 물품 공유
  • 인스턴스를 가능한 공유해서 사용하여 메모리를 절약
  • 다수의 유사 객체를 생성하거나 조작할 때 유용함

프록시

Proxy
  • 하기 어려운 업무를 대리로 해주는 사람
  • 접근이 어려운 객체와 여기 접근하려는 객체 사이의 인터페이스 역할
  • 네트워크 연결, 메모리의 대용량 객체로의 접근에 이용

행위 패턴

Behavioral Pattern

책임 연쇄

Chain of Responsibility
  • 연속해서 나눠받는 물레방아
  • 한 객체가 처리하지 못하면 다음 객체로 넘어가는 패턴
  • 요청이 해결될 때까지 고리를 따라 책임이 넘어감

커맨드

Command
  • 명령어를 하나로 합쳐둔 것
  • 요청을 캡슐화하여 재이용하거나 취소할 수 있도록 저장하거나 로그로 남김
  • 추상클래스와 구체클래스로 나뉨

인터프리터

Interpreter
  • 언어 번역가
  • 언어에 문법 표현을 정의함
  • SQL이나 통신 프로토콜에 사용

반복자

Iterator
  • 같은 명령의 반복
  • 접근이 잦은 객체에 대해 동일한 인터페이스를 사용하도록 함
  • 내부 표현 방법의 노출 없이 순차적인 접근 가능

중재자

Mediator
  • 매매를 중개해주는 중개사이트
  • 객체들 간의 복잡한 상호작용을 캡슐화하여 객체로 정의
  • 객체 사이의 결합도를 감소시킴

메멘토

Memento
  • 기억 속의 그 때로 돌아감.
  • 객체를 특정 시점의 상태로 돌릴 수 있는 기능
  • ctrl+z 와 같은 기능 개발시 사용

옵서버

Observer
  • 변화를 지켜보고 알려주는 것
  • 한 객체의 상태 변화시 상속되어 있는 다른 객체들에게 알림
  • 시스템간에 이벤트를 생성하고 수신할 때 사용

상태

State
  • 상태에 따라 다른 방법을 사용함
  • 객체의 상태에 따라 동일한 동작을 다르게 처리해야 할 때 사용
  • 객체 상태를 캡슐화하고 이를 참조함

전략

Strategy
  • 여러 전략을 정하고 필요할 때 선택하여 씀
  • 동일한 계열의 알고리즘을 캡슐화하여 상호 교환할 수 있게 정의함
  • 원하는 알고리즘을 선택하여 사용하며 클라이언트에 영향 없이 알고리즘 변경 가능

템플릿 메소드

Template Method
  • 방법들을 큰 틀로 묶는 것
  • 상위 클래스에서 골격 정의, 하위 클래스에서 세부 처리를 구체화
  • 유사한 서브 클래스의 공통된 내용을 상위 클래스에서 정의(유지보수를 용이하게 함)

방문자

Visitor
  • 책을 만들기 위해 저자, 편집자를 번갈아가며 방문
  • 각 클래스들의 데이터 구조에서 처리 기능을 별도의 클래스로 구성
  • 분리된 기능은 각 클래스를 방문하여 수행
  1. 에리히 감마(Erich Gamma), 리처드 헬름(Richard Helm), 랄프 존슨(Ralph Johnson), 존 블리시데스(John Vlissides)