디자인 패턴이란?
- 아키텍처 설계 수준보다 낮은 수준의 설계 문제에 재사용 가능한 솔루션을 제공한다.
디자인 패턴의 혜택
- 쉽게 재사용 가능하며 개발 시간 단축된다.
- 소프트웨어 구조 파악이 용이하며 설계 관련 지식이 정리된다.
- 개발자(설계자) 간의 의사소통이 원할해진다.
- 객체지향 설계 원리를 잘 따르게 된다.
Gof 디자인 패턴
- 여러 가지 문제에 대한 설계 사례를 분석하여 서로 비슷한 문제를 해결하기 위한 설계들을 분류하고, 각 문제 유형별로 가장 적합한 설계를 일반화해 패턴으로 정립한 것을 의미한다.
- 소프트웨어 설계에 대한 지식이나 노하우가 문제 유형별로 잘 구체화되어 있을 뿐 아니라, 동일한 문제 유형에 대해서는 그 해결 방법에 대한 지식이나 노하우가 패턴 형태로 충분히 일반화된 것을 말한다.
생성 패턴
- 특정 객체가 생성되거나 변경되어도 프로그램 구조에 영향을 크게 받지 않도록 유연성을 제공한다.
- 객체 생성과 관련된 패턴들로 객체의 생성과 조합을 캡슐화
생성 패턴의 종류
- factory method : 생성할 객체의 클래스를 서브 클래스로 분리해 객체를 생성
- singleton : 한 클래스에 한 객체만 존재하도록 제한
- prototype : 기존 객체를 복제함으로써 객체를 생성
- builder : 생성과 구현을 분리해 복합 객체를 생성
- abstract factory : 동일한 주제와 관련된 다른 객체들의 집합을 생성
구조 패턴
- 프로그램 구조에 관련된 패턴들로 프로그램 내의 자료 구조나 인터페이스 구조 등 프로그램의 구조를 설계하는데 활용할 수 있는 패턴들
구조 패턴의 종류
- composite : 여러 개의 객체들로 구성된 복합 객체와 단일 객체를 구별 없이 다루게 해주는 패턴
- adapter : 인터페이스가 호환되지 않는 클래스들을 함께 이용할 수 있도록 중간에 맞춰주는 패턴
- bridge : 추상화된 부분과 실제 구현 부분을 독립적으로 확장
- decoration : 기존 객체에 동적으로 기능을 추가하거나 오버라이드
- facade : 서브시스템에 있는 인터페이스 집합에 대하여 하나의 통합된 인터페이스를 제공
- flyweight : 다수의 유사한 객체를 생성, 조작하는 비용을 절감
- proxy : 실제 객체를 감싸고 추가 기능을 제공하면서도 실제 객체 접근을 통제
행동 패턴
- 객체나 클래스 사이의 알고리즘이나 책임 분배에 관련된 패턴들로 반복적으로 사용되는 객체들의 상호작용을 패턴화
행동 패턴의 종류
- iterator : 반복이 필요한 자료구조를 모두 동일한 인터페이스를 통해 순차적 접근을 제공
- observer : 어떤 클래스에 변화가 일어났을 때, 이를 감지하여 다른 클래스에 통보
- strategy : 알고리즘 군을 정의하고 각각 하나의 클래스로 캡슐화 한 다음 선택하여 적용
- template method : 상위 클래스에서는 추상적으로 표현하고 그 구체적인 내용은 하위 클래스에서 결정
- visitor : 각 클래스의 데이터 구조로부터 처리 기능을 분리하여 별도의 visitor 클래스로 만듦
- chain of responsibility : 책임들이 연결되어 있어 내가 책임을 못 질 것 같으면 다음 책임자에게 자동으로 넘김
- command : 요청된 명령어를 캡슐화하여 각 명령이 들어오면 그에 맞는 서브 클래스가 선택되어 실행하는 것
- mediator : 클래스 간의 복잡한 상호작용을 캡슐화하여 한 클래스에 위임해서 중재 처리
- state: 동일한 동작을 객체의 상태에 따라 다르게 처리해야 할 때 사용
- memento : 클래스 설계 관점에서 객체의 정보를 저장 (undo 기능 유용)
- interpreter : 간단한 언어의 문법을 정의하고 해석에 사용, 문법 규칙을 클래스화한 구조 (SQL,통신 프로토콜)
대표적인 패턴들의 추가적인 정보
싱글톤 패턴 - 생성 패턴
- 특정 클래스의 객체가 오직 한 개만 존재하도록 보장
- 객체를 강제적으로 하나만 생성하려는 목적 예) DB 커넥션을 위한 인터페이스
방법
- 클래스 자체를 정적 변수로 한다.
- 생성자는 private으로 선언한다.
- 유일한 객체를 접근하는 정적 메서드
팩토리 메소드 패턴 - 생성 패턴
- 클라이언트에서 사용할 클래스의 객체를 생성하는 책임을 분리하여 객체 생성에 변화를 대비
- 팩토리 메소드를 포함하는 추상 클래스를 정의하고 하위 클래스에서 인스턴스를 생성하도록 하는 방식
추상 팩토리 패턴 - 생성 패턴
- 구체적인 클래스를 지정하지 않고 관련성을 갖는 객체들의 집합을 생성
- 객체를 사용할 클라이언트에서 구체적인 객체 생성을 지정하는 책임을 분리하기 위하여 추상 인터페이스를 이용하여 관련 객체 패밀리를 생성
어댑터 패턴 - 구조 패턴
- 기존 클래스를 재사용할 수 있도록 중간에서 맞춰주는 역할
- 사용 가능한 서비스 인터페이스를 클라이언트가 예상하는 인터페이스에 맞게 조정
- 어댑터 : 서비스 제공 인터페이스를 클라이언트가 기대하는 인터페이스로 변환
데코레이션 패턴 - 구조 패턴
- 집합 관계와 위임을 사용하여 기존 클래스의 기능을 동적으로 유연하게 확장
- 수정에 의한 기능추가 : ocp 원리에 위배
- 상속에 의한 추가 : 기능의 조합 수 만큼의 서브클래스가 필요
상태 패턴 - 행동 패턴
- 상태에 따라 객체의 동작을 변경해야 하는 경우
- 맥락과 상태를 별도 구현하여 융통성을 달성하기 위한 체계적이고 느슨한 결합 방식
옵서버 패턴 - 행동 패턴
- 옵서버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵서버에게 통지