GOF(Gang of Four) 디자인 패턴
: 소프트웨어의 개발에서 반복적인 문제의 발생을 해결하기 위해 사용되는 일련의 디자인 솔루션이다.
23가지 패턴으로 구성되어있으며 크게 생성, 구조, 행위로 나뉘게 된다.
1. 생성
- 추상 팩토리 (Abstract Factory):
서로 관련이 있는 객체들을 생성하기 위한 인터페이스를 제공하는 패턴이다.
구체적인 클래스의 인스턴스화를 숨기고, 클라이언트 코드에서는 인터페이스를 통해 객체를 생성한다.
관련성이 있는 객체들의 일관성 있는 생성을 보장하고, 객체들 간의 결합도를 낮출 수 있다. - 팩토리 메서드 (Factory Method):
객체를 생성하는 인터페이스를 정의하고, 하위 클래스가 어떤 클래스의 인스턴스를 생성할지 결정하도록 하는 패턴이다.
객체 생성에 대한 책임을 하위 클래스로 위임하여 유연성을 확보할 수 있다.
상위 클래스에는 추상적인 팩토리 메서드가 있고, 하위 클래스에서는 이를 구체화하여 실제 객체를 생성한다. - 싱글톤 (Singleton):
클래스의 인스턴스를 하나만 생성하고, 어디에서든 이 인스턴스에 접근할 수 있도록 하는 패턴이다.
전역 변수의 사용을 제한하고, 객체에 대한 단일 접근 지점을 제공한다.
인스턴스가 오직 한 번만 생성되며, 이후에는 생성된 인스턴스를 반환한다. - 빌더 (Builder):
복합 객체의 생성 과정을 단계별로 분리하여 객체를 생성하는 패턴입니다.
복잡한 객체의 생성 과정을 추상화하고, 객체의 내부 표현을 독립적으로 조작할 수 있습니다.
동일한 생성 프로세스를 사용하여 서로 다른 표현의 객체를 생성할 수 있습니다. - 프로토타입 (Prototype):
객체의 인스턴스를 사용하여 새로운 객체를 생성하는 패턴이다.
객체를 복제하는 방식으로 인스턴스 생성을 처리하며, 복잡한 인스턴스 생성 과정을 단순화한다.
기존 객체를 복제하여 새로운 객체를 생성하므로, 객체 생성 비용을 줄일 수 있다.
2. 구조
- 어댑터 (Adapter):
호환되지 않는 인터페이스를 갖는 클래스들을 함께 동작하도록 만드는 패턴이다.
클래스 간의 인터페이스 호환성을 유지하면서 재사용성을 높인다.
어댑터 클래스를 사용하여 클라이언트가 호환되지 않는 인터페이스를 사용할 수 있게 한다. - 브리지 (Bridge):
추상화와 구현을 분리하여 각각 독립적으로 변형할 수 있게 하는 패턴이다.
추상적인 부분과 구현적인 부분을 분리함으로써 유연성을 확보하고, 확장성을 향상시킨다.
추상적인 부분과 구체적인 부분이 별도의 클래스로 구현되며, 이들은 다른 클래스들과 독립적으로 변형될 수 있다. - 컴포지트 (Composite):
객체들을 트리 구조로 구성하여 부분-전체 계층을 표현할 수 있게 하는 패턴이다.
개별 객체와 복합 객체를 동일한 방식으로 다룰 수 있어 일관된 처리를 제공한다.
단일 객체와 복합 객체를 동일한 인터페이스로 다루므로 클라이언트가 객체 구조의 복잡성을 알 필요가 없다. - 데코레이터 (Decorator):
객체에 추가적인 기능을 동적으로 덧붙일 수 있게 하는 패턴이다.
상속을 사용하지 않고도 객체의 기능을 확장할 수 있다.
데코레이터 클래스는 동일한 인터페이스를 구현하며, 런타임에 기존 객체에 새로운 기능을 추가한다. - 퍼사드 (Facade):
서브시스템의 복잡한 인터페이스를 단순화하여 외부에 통일된 인터페이스를 제공하는 패턴이다.
복잡한 서브시스템을 감싸고, 클라이언트가 서브시스템을 더 쉽게 사용할 수 있도록 한다.
서브시스템의 내부 동작을 감추고, 단일 진입점을 제공하여 간결한 인터페이스를 제공한다. - 프록시 (Proxy):
접근 제어, 보안, 인증 등의 부가적인 기능을 제공하기 위해 대리자 객체를 사용하는 패턴이다.
클라이언트와 실제 객체 사이에 대리자 객체를 두어, 클라이언트의 요청을 중개하거나 제어한다.
프록시 객체는 실제 객체와 동일한 인터페이스를 구현하므로 클라이언트는 프록시를 실제 객체로 인식하지 못한다. - 플라이웨이트 (Flyweight):
많은 수의 유사한 객체를 효율적으로 공유하여 메모리 사용량을 최적화하는 패턴이다.
객체의 공유를 통해 메모리 사용을 줄이고 성능을 향상시킨다.
객체의 내부 상태는 내부적으로 유지하고, 외부에서는 공유 객체의 상태를 조작할 수 없다.
3. 행위
- 옵저버 (Observer):
객체 간의 일대다 종속 관계를 정의하여, 한 객체의 상태 변경 시 의존 객체들이 자동으로 업데이트되도록 하는 패턴이다.
주체(Subject) 객체와 옵저버(Observer) 객체로 구성되며, 상태 변화 시 주체 객체는 등록된 옵저버들에게 알린다. - 스트래티지 (Strategy):
유사한 동작을 캡슐화하고, 동작을 실행 시점에 교환할 수 있게 하는 패턴이다.
알고리즘을 정의하고, 이를 독립적으로 사용할 수 있는 전략 객체로 캡슐화한다.
클라이언트는 전략 객체를 교환하여 동적으로 알고리즘을 변경할 수 있다. - 상태 (State):
객체의 내부 상태에 따라 동작이 달라지도록 하고, 상태 변경 시 객체의 동작을 변경하는 패턴이다.
객체의 상태를 별도의 클래스로 캡슐화하여, 상태에 따른 동작을 상태 클래스에 위임한다.
클라이언트는 상태를 변경하여 객체의 동작을 변경할 수 있다. - 책임 연쇄 (Chain of Responsibility):
요청을 보내는 객체와 이를 처리하는 객체 사이의 결합을 피하고, 요청을 처리할 수 있는 객체를 동적으로 결정하는 패턴이다.
여러 객체가 연결된 체인을 구성하고, 각 객체는 요청을 처리하거나 다음 객체에게 전달한다.
요청을 처리할 객체가 런타임에 결정되므로 유연성과 확장성을 제공한다. - 커맨드 (Command):
요청을 객체로 캡슐화하여 매개변수화하고, 요청을 처리하는 객체를 변경할 수 있게 하는 패턴이다.
요청을 객체로 만들어 실행할 수 있으며, 실행 취소 및 다시 실행할 수도 있다.
클라이언트는 요청 객체를 생성하고, 수신자 객체에 대한 참조를 설정하여 요청을 수행한다. - 인터프리터 (Interpreter):
언어나 문법을 해석하고 실행하는 패턴이다.
문법 규칙을 클래스로 표현하고, 이를 조합하여 문장을 해석하고 처리한다.
해석기는 문장을 구성하는 토큰들을 해석하여 실행 결과를 도출한다. - 이터레이터 (Iterator):
컬렉션 객체의 요소를 순서대로 접근할 수 있는 인터페이스를 제공하는 패턴이다.
컬렉션의 내부 구조에 대한 정보를 노출하지 않고, 요소에 일관된 방식으로 접근할 수 있다.
이터레이터 객체는 컬렉션 객체의 구조에 독립적으로 요소를 열거하고 접근한다. - 중재자 (Mediator):
객체들 간의 복잡한 상호작용을 캡슐화하여, 객체 간의 직접적인 통신을 제거하는 패턴이다.
중재자 객체를 통해 객체들 간의 통신을 조정하고, 객체 간의 결합도를 낮춘다.
객체들은 중재자 객체에게 메시지를 전달하고, 중재자는 적절한 객체에게 메시지를 전달한다. - 메멘토 (Memento):
객체의 상태를 저장하고 복원할 수 있도록 하는 패턴이다.
객체의 상태를 캡슐화하여 메멘토 객체에 저장하고, 필요한 시점에 복원한다.
객체의 내부 상태를 외부로 노출하지 않고, 복원을 위한 정보를 유지할 수 있다. - 비지터 (Visitor):
객체 구조와 독립적으로 동작하는 연산을 정의하는 패턴이다.
객체 구조 내의 각 요소에 대해 다양한 연산을 수행할 수 있는 방문자 객체를 구현한다.
방문자 객체를 통해 객체 구조 내의 요소를 순회하고 연산을 수행한다. - 템플릿 메서드 (Template Method):
알고리즘의 구조를 정의하고, 일부 단계를 서브클래스에서 재정의할 수 있게 하는 패턴이다.
알고리즘의 공통 부분은 슈퍼클래스에서 구현하고, 일부 단계는 서브클래스에서 구체화한다.
템플릿 메서드를 사용하여 알고리즘의 전체 구조를 유지하면서 특정 단계를 재정의할 수 있다.
'study' 카테고리의 다른 글
클래스와 객체 (0) | 2023.06.24 |
---|---|
UI 종류 (0) | 2023.06.23 |
User Interface(UI) 설계지침 (0) | 2023.06.22 |
정보공학 개발 방법론, Entity-Relationship Diagram(ERD) (0) | 2023.06.22 |
Extreme Programming (XP. eXtreme Programming) (0) | 2023.06.22 |