이번 글에서는
- 해당 챕터에서는 실제 디자인 패턴을 적용하는 방법에 대해서 학습합니다.
- 패턴 카탈로그에 대해 학습한뒤 가장 훌륭한 패턴 카탈로그 저서인 GoF 디자인 패턴의 서술 방식을 살펴봅니다.
- 디자인 패턴에서 사용되는 전문 용어를 살펴봅니다.
- 디자인 패턴을 분류하는 방법들에 대해서 학습합니다.
패턴 카탈로그(GoF 템플릿) 살펴보기
- 패턴 카탈로그는 아래와 같이 이루어져 있습니다.
- Implementation/SampleCode(구현 및 샘플 코드)
- 위와 같은 서술 방식은 디자인 패턴을 익히고 패턴 사이의 관계를 빠르게 파악할 수 있습니다.
- Structure 부분을 읽어 본뒤 Participants(구성 요소) 부분에서 각 클래스의 역할을 제대로 파악합니다.
- Implementation/Samplecode를 파악하고 구현기법과 주의사항들을 파악합니다.
디자인 패턴의 정의
- 디자인 패턴은 특정 컨텍스트 내에서 주어진 문제 해결책입니다.
- 컨텍스트(Context)
- 단, 반복적으로 일어날 수 있는 상황이어야 합니다.
- 문제(Problem)
- 문제란 컨텍스트 내에서 이뤄야 하는 목표를 의미합니다.
- 해결책(Solution)
- 제약조건 속에서 누가 적용해도 목표를 이룰수 있는 일반적인 디자인을 의미합니다.
디자인 패턴 분류하기
싱글톤 | 전략 | 데코레이터 |
추상 팩토리 | 싱글톤 | 어뎁터 |
팩토리 메소드 | 옵저버 | 컴포지트 |
프로토 타입 | 반복자 | 퍼사드 |
빌더 | 템플릿 메소드 | 프록시 |
| 상태 | 플라이웨이트 |
| 인터프리터 | 브리지 |
| 역할 변경 | |
| 비지터 | |
| 중재자 | |
| 메멘토 | |
- 회색 표시는 잘 사용하지 않는 패턴들을 의미합니다.
- 많은 디자인 패턴이 등장하면서 패턴 카탈로그에서는 생성 패턴, 행동 패턴, 구조 패턴 3가지 주제로 디자인 패턴을 분류하기 시작했습니다.
- 생성 패턴은 객체 인스턴스를 생성하는 패턴으로 클라이언트와 그 클라이언트가 생성해야 하는 객체 인스턴스 사이의 연결을 끊어주는 패턴입니다.
- 행동 패턴은 클래스와 객체들이 상호작용하는 방법과 역할을 분담하는 방법을 다루는 패턴입니다.
- 구조 패턴은 클래스와 객체를 더 큰 구조로 만들 수 있게 구성을 사용하는 패턴입니다.
- 생성 패턴, 행동 패턴, 구조 패턴 3가지로 분류하는 방법 외에도 클래스 패턴, 객체 패턴으로 분리하는 방법도 존재합니다.
클래스 패턴 | 객체 패턴 |
템플릿 메소드 | 전략 |
팩토리 메소드 | 데코레이터 |
어댑터 | 옵저버 |
인터프리터 | 커맨드 |
| 반복자 |
| 컴포지트 |
| 퍼사드 |
| 프록시 |
| 프로토타입 |
| 추상팩토리 |
| 싱글톤 |
| 브리지 |
| 플라이웨이트 |
| 책임 연쇄 |
| 중재자 |
| 빌더 |
| 비지터 |
| 메멘토 |
- 클래스 패턴은 클래스 사이의 관계가 상속으로 어떻게 정의되는지를 다룹니다. 클래스 사이의 관계는 대부분 컴파일할 때 결정 됩니다.
- 객체 패턴은 객체 사이의 관계를 다룹니다. 객체 사이의 관계는 보통 구성으로 정의됩니다. 일반적으로 실행 중에 관계가 결정되므로 클래스 패턴보다 동적이고 유연합니다.
- 이외에도 생성, 구조, 행동 3가지로 나눈 다음 분리 패턴을 적용해서 나누는 방식이 한 가지 더 존재하는데 이 글에서는 가장 많이 사용하는 두 가지 방식에 대해서만 정리하겠습니다.
안티 패턴
- 안티 패턴은 어떤 문제의 나쁜 해결책에 이르는 길을 의미합니다.
- 안티 패턴의 가장 큰 역할은 개발자들이 구현할 때 안 좋은 방향의 구현을 미리 막아준다는 점에 있습니다.
- 안티 패턴은 장기적인 관점에서 발생하는 문제에 대해 설명합니다.
- 안티 패턴도도 일반 디자인 패턴과 마찬가지로 개발 안티 패턴, 객체지향 안티 패턴, 조직 안티 패턴 등 다양한 특정 영역의 안티 패턴이 존재합니다.