객체지향 소프트웨어를 설계할 때에는 지금 당장 갖고 있는 문제를 해결하는 것 뿐만 아니라
나중에 생길 수 있는 문제나 추가된 요구사항들도 수용할 수 있도록 일반적이고 포괄적이어야 한다.
이를 위해 SOLID 원칙 등 객체지향적 소프트웨어 설계 방법론을 따라 개발하기 위해 노력한다.
디자인 패턴이란
모듈의 세분화된 역할이나 모듈들 간의 인터페이스 구현 방식을 설계할 때 참조할 수 있는 전형적인 해결 방식을 말한다.
디자인 패턴을 통해 설계 문제, 해결 방법, 적용 시기, 결과 등을 알 수 있다.
Gof Design Pattern
[Gof Design Pattern] 은 Gof(Gang of four) 라는 Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides 가 개발을 구조적으로 설계하려고 처음으로 디자인 패턴을 구체화한 것
- 목적에 따라 분류
- 생성 : 객체의 생성 과정에 관여
- 구조 : 객체의 합성에 관여
- 행동 : 객체가 상호작용하는 방법이나 관심사 분리하는 방법에 관여
- 범위에 따라 분류
- 클래스 : 클래스와 서브클래스 간의 관련성 (주로 상속)
- : 컴파일 타임에 정적으로 결정
- 객체 : 객체 간의 관련성
- : 런타임에 변경될 수 있는 동적인 성격
1. 생성 패턴
- 객체의 인스턴스 과정을 추상화 하는 방법을 말한다.
- 객체의 생성과 참조 과정을 캡슐화
- -> 객체가 생성되거나 변경되어도 프로그램 구조에 영향을 받지 않도록 한다.
- 생성 클래스 패턴
- 객체를 생성하는 일부를 서브 클래스가 담당
- 생성 객체 패턴
- 객체 생성을 다른 객체에게 위임
이름 | 의도 |
Abstract Factory | 구체적인 클래스를 지정하지 않고 인터페이스를 통해 서로 연관되는 객체들을 그룹으로 표현 |
Builder | 복합 객체의 생성과 표현을 분리하여 동일한 생성 절차에도 다른 표현 결과를 만들어냄 |
Factory Method | 객체 생성을 서브 클래스로 위임하여 캡슐화 |
Prototype | 원본 객체를 복사함으로써 객체를 생성 |
Singleton | 어떤 클래스의 인스턴스는 하나임을 보장하고, 어디서든 참조할 수 있도록 함 |
2. 구조 패턴
- 클래스나 객체들을 조합해 더 큰 구조로 만들 수 있게 하는 방법을 말한다.
- 구조 클래스 패턴
- 상속을 통해 클래스나 인터페이스 합성
- 구조 객체 패턴
- 객체를 합성하는 방법을 정의
이름 | 의도 |
Adapter | 클래스의 인터페이스를 다른 인터페이스로 변환하여 다른 클래스가 이용할 수 있도록 함 |
Bridge | 구현부에서 추상층 분리 -> 각자 독립적으로 확장할 수 있도록 함 |
Composite | 객체들의 관계를 트리 구조로 구성 -> 복합 객체, 단일 객체 구분 없이 다룸 |
Decorator | 주어진 상황 및 용도에 따라 어떤 객체에 다른 객체를 덧붙임 |
Facade | 서브 시스템에 있는 인터페이스 집합에 대해 하나의 통합된 인터페이스 (Wrapper) 제공 |
Flyweight | 크기가 작은 여러개의 객체를 매번 생성하지 않고, 가능한 한 공유할 수 있도록 -> 메모리 절약 |
Proxy | 접근이 어려운 객체로의 접근을 제어하기 위해 객체의 Surrogate(대리), Placeholder 제공 |
3. 행위 패턴
- 클래스나 객체들이 서로 상호작용하는 방법을 말한다.
- 어떤 알고리즘을 어떤 객체에 할당하는 것이 좋을지를 정의한다.
- 하나의 객체로 수행할 수 없는 작업을 여러 객체로 분배함으로서 결합도를 최소화 할 수 있다.
- 행위 클래스 패턴
- 상속을 통해 알고리즘과 제어 흐름을 기술
- 행위 객체 패턴
- 작업을 수행하기 위해 객체 집합이 어떻게 협력하는지 기술
이름 | 의도 |
Chain of Responsibility | 요청 받는 객체를 연쇄적으로 묶어 요청을 처리하는 객체를 만날때까지 객체 Chain 을 따라 요청을 전달 |
Command | 요청을 객체의 형태로 캡슐화 -> 재사용하거나 취소할 수 있도록 저장 |
Interpreter | 특정 언어의 문법 표현을 정의 |
Iterator | 내부를 노출하지 않고 접근이 잦은 어떤 객체의 원소를 순차적으로 접근할 수 있는 동일한 인터페이스 제공 |
Mediator | 한 집합에 속해있는 객체들의 상호작용을 캡슐화하여 새로운 객체로 정의 |
Memento | 객체가 특정 상태로 다시 돌아올 수 있도록 내부 상태를 실체화 |
Observer | 객체 상태가 변할 때 관련 객체들이 그 변화를 통지받고 자동으로 갱신 |
State | 객체의 상태에 따라 동일한 동작을 다르게 처리 |
Strategy | 동일 계열의 알고리즘 군을 정의하고 캡슐화하여 상호 교환이 가능하도록 함 |
Template Method | 상의 클래스는 알고리즘의 골격만을 작성하고 구체적인 처리는 서브 클래스로 위임 |
Visitor | 객체의 원소에 대해 수행할 연산을 분리하여 별도의 클래스로 구성 |