디자인 패턴이란 프로그래밍을 할 때에 공통적으로 생기는 문제를 해결하고자 설계한 일정한 코드의 패턴이다. 애플리케이션이나 시스템을 디자인하는 과정에서 자주 발생하는 문제를 해결하는데에 쓰이는 형식화 된 관행이자, 재사용 가능한 해결책이기도 하다.
디자인 패턴에 대해 다루는 유명한 책 중 하나인 'GoF의 디자인 패턴'에서 다룬 디자인 패턴의 종류는 다음과 같다.
객체 생성과 관련된 패턴이다. 객체의 생성과 조합을 캠슐화하여 특정 객체가 생성되거나 변경되어도 프로그램 구조에 크게 영향을 받지 않도록 유연하게 설계하는 것이 목적이다.
-
- 클래스의 인스턴스를 오직 한개만 생성하여 제공하는 패턴
-
- 객체 생성 처리를 서브 클래스로 분리해 처리하도록 캡슐화하는 패턴
-
- 관련있는 여러 객체를 구체적인 클래스에 의존하지 않고 생성할 수 있도록 하는 패턴
-
- 객체를 만드는 프로세스의 직관성, 유연성을 높이고 독립적으로 분리하는 패턴
-
- 기존 인스턴스를 복제하여 새로운 인스턴스를 만드는 패턴
클래스나 객체를 조합해 더 큰 구조를 만드는 패턴이다. 객체들을 서로 묶어 단일 인터페이스나 새로운 기능을 제공한다.
-
- 기존 코드를 클라이언트가 사용하는 인터페이스의 구현체로 바꿔주는 패턴
-
- 추상적인 것과 구체적인 것을 분리하여 연결하는 패턴
-
- 그룹 전체와 개별 객체를 동일한 컴포넌트로 취급하여 처리하는 패턴
-
- 기존 코드를 변경하지 않고 부가 기능을 추가하는 패턴
-
- 복잡한 서브 시스템 의존성을 간단한 인터페이스로 추상화하는 패턴
-
- 외적인 속성과 내적인 속성을 분리하고 재사용하여 메모리 사용을 줄이는 패턴
-
- 해당 객체를 대항하는 객체를 통해 대상 객체에 접근하는 방식을 제공하는 패턴
객체나 클래스 사이의 알고리즘이나 책임을 분배하는 것에 관련된 패턴이다. 한 객체가 혼자 수행할 수 없는 작업을 여러 개의 객체로 분배하고, 객체 사이의 결합도를 최소화하는 것에 중점을 둔다.
-
- 요청을 보내는 쪽(sender)과 요청을 처리하는 쪽(receiver)을 분리하는 패턴
-
- 요청을 캡슐화 하여 호출자(invoker)와 수신자(receiver)를 분리하는 패턴
-
- 자주 등장하는 문제를 간단한 언어로 정의하고 재사용하는 패턴
-
- 집합 객체 내부 구조를 노출시키지 않고 순회 하는 방법을 제공하는 패턴
-
- 여러 객체들이 소통하는 방법을 캡슐화하는 패턴
-
- 캡슐화를 유지하면서 객체 내부 상태를 외부에 저장하는 패턴
-
- 다수의 객체가 특정 객체 상태 변화를 감지하고 알림을 받는 패턴
-
- 객체의 상태에 따라 객체의 행위 내용을 변경해주는 패턴
-
- 행위를 클래스로 캡슐화해 동적으로 행위를 자유롭게 바꿀 수 있게 해주는 패턴
-
- 어떤 작업을 처리하는 일부분을 서브 클래스로 캡슐화해 전체 일을 수행하는 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내역을 바꾸는 패턴
-
- 기존 코드를 변경하지 않고 새로운 기능을 추가하는 패턴