C++ 디자인 패턴
Architecture & Design Pattern 전체 링크
패턴 (Pattern)
- 특정한 문제를 해결하기 위해 반복적으로 발생하는 문제와 그에 대한 해결책을 포괄하는 설계 또는 구조
- 아키텍처 패턴보다 더 구체적인 문제를 해결하고, 클래스와 객체 간의 관계를 정의
컨텍스트 (Context)
- 패턴이 적용되는 특정한 상황이나 환경
문제 (Problem)
- 패턴이 적용되는 상황에서 발생하는 구체적인 어려움이나 요구사항
안티 패턴 (Anti-pattern)
- SW 개발 과정에서 자주 발생하는 비효율적이거나 잘못된 걸계, 개발 또는 관리 관행
생성 패턴 (Creational Patterns)
- 객체 생성 메커니즘에 관련된 패턴
- 객체 생성을 추상화하고, 시스템이 어떻게 객체를 생성하고 조합하는지에 대한 규칙을 제공한다.
- 클라이언트와 클라이언트에서 생성해야 할 객체 인스턴스 사이의 관계를 끊는다.
싱글턴 패턴 (Singleton Pattern)
- 특정 클래스에 대해 객체 인스턴스가 하나만 만들어지도록 하고, 전역 접근을 제공하는 패턴
- 전역 변수에 객체를 대입하면 Application이 시작되고 종료되기까지 자원을 차지하지만,
싱글턴 패턴은 필요할 때만 객체를 만들 수 있다.
- 실제로 객체가 필요하면 인스턴스를 직접 만들지 않고, 인스턴스를 요청하도록 구현한다. (getInstance)
팩토리 메서드 패턴 (Factory Method Pattern)
- 객체를 생성하는 과정을 서브 클래스에서 결정할 수 있도록 하는 패턴
- 객체 생성에 대한 구체적인 구현을 서브 클래스로 미룬다.
- 클라이언트는 객체 생성에 대한 구체적인 클래스를 알 필요 없이, 추상 클래스를 통해 인터페이스에만 의존할 수 있다.
추상 팩토리 패턴 (Abstract Factory Pattern)
- 관련 있는 객체들의 생성을 추상화하여 객체 생성을 캡슐화하는 방법을 제공하는 패턴
- 클라이언트가 구체적인 클래스를 알지 못해도, 해당 클래스와 상호작용을 할 수 있도록 도와준다.
- 초기 객체 생성 비용이 많이 드는 경우 사용하는 패턴
- 객체를 생성할 때 기존 객체의 복사를 통해 생성한다.
- 생성할 객체의 유형에 대한 세부 정보를 숨기면서 복잡한 객체를 만들 수 있는 방법을 제공한다.
- 객체 생성 과정을 추상화하여 복잡한 객체를 조립하는 패턴
- 객체를 생성하는 방법을 클라이언트로부터 숨기고, 생성 과정을 단계적으로 나눈다.
행동 패턴 (Behavioral Patterns)
- 클래스와 객체들이 상호 작용하는 방법 및 역할을 분담하는 패턴
- 객체 간의 상호 작용을 설명하고, 객체 간의 행동을 조직한다.
- 객체나 클래스 사이의 알고리즘 및 책임을 분산시킨다.
전략, 스트래티지 패턴 (Strategy Pattern)
- 알고리즘을 캡슐화하여 동적으로 교체할 수 있도록 하는 패턴
- 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있다.
옵저버 패턴 (Observer Pattern)
- 객체 간의 일대다 종속성을 정의하는 패턴
- 객체의 상태가 변경될 때, 해당 객체에 종속된 다른 객체들이 자동으로 알림을 받아 갱신하도록 한다.
반복자, 이터레이터 패턴 (Iterator Pattern)
- 객체의 컬렉션을 순회하고 요소에 접근할 수 있는 방법을 제공하는 패턴
- 컬렉션의 요소에 대한 구체적인 구현을 노출시키지 않고 컬렉션을 순회
상태, 스테이트 패턴 (State Pattern)
- 객체의 상태에 따라 객체의 행동을 바꾸는 패턴
- 상태에 대한 행동을 캡슐화하여, 위임을 이용해 필요한 행동을 선택한다.
- 객체의 클래스가 바뀌는 것과 같은 결과를 얻을 수 있다.
커맨드 패턴 (Command Pattern)
- 행동을 캡슐화하여 다른 객체로 전달하는 패턴
- 요청을 객체로 캡슐화하여 매개변수화된 메서드 호출, 메서드 실행 또는 연산을 지원한다.
템플릿 메서드 패턴 (Template Method Pattern)
- 알고리즘의 구조를 정의하는 패턴
- 알고리즘 구조는 유지하면서 알고리즘의 일부 단계를 서브클래스에서 구현할 수 있다.
역할 사슬, CoR 패턴 (Chain of Responsibility Pattern)
- 요청을 보내는 객체와 요청을 처리할 수 있는 여러 객체 사이에 역할 사슬을 구성하는 패턴
- 요청을 처리하는 여러 개의 객체가 있는 경우, 요청을 처리할 객체를 결정할 수 있다.
- 객체의 구조와 동작을 분리하여 새로운 동작을 추가하는 패턴
- 어떤 클래스에 대해 특정 메서드를 분리하고 싶을 때 사용할 수 있다.
중재자, 미디에이터 패턴 (Mediator Pattern)
- 객체 간의 상호작용을 캡슐화하여 복잡한 통신과 제어를 한 곳으로 집중시키는 패턴
- 객체 간의 직접적인 통신을 방지하여 결합도를 낮춘다.
- 객체의 내부 상태를 저장하고 나중에 복원할 수 있는 패턴
- 상태를 변경하면서 객체를 수정할 때 사용한다.
구조 패턴 (Structural Patterns)
- 클래스나 객체를 구성, 조합해 더 큰 구조를 만드는 패턴
- 객체와 클래스의 구성을 설명하고, 상속을 사용하지 않고 인터페이스를 통해 기능을 확장한다.
복합체, 컴포지트 패턴 (Composite Pattern)
- 객체들을 트리 구조로 구성하여 부분-전체 계층 구조(part-whole hierarchy)를 표현하는 패턴
- 클라이언트에서 개별 객체와 다른 객체들로 구성된 복합 객체(composite)를 똑같은 방식으로 다룰 수 있다.
데코레이터 패턴 (Decorator Pattern)
- 기존 객체의 동작을 수정하지 않고, 그 객체의 기능을 확장하거나 수정하는 패턴
- 런타임에 동적으로 객체의 기능을 추가하거나 수정할 수 있다.
어댑터 패턴 (Adapter Pattern)
- 호환되지 않은 두 개의 인터페이스 사이에 중간에서 어댑터를 두어 상호 작용을 하도록 하는 패턴
- 기존의 코드나 라이브러리를 변경하지 않고 새로운 코드나 라이브러리를 통합한다.
퍼사드 패턴 (Facade Pattern)
- 복잡한 시스템 또는 서브시스템을 단순화된 인터페이스로 제공하는 패턴
- 퍼사드에서 고수준 인터페이스를 정의하기 때문에 서브시스템을 더 쉽게 사용할 수 있다.
- 클라이언트가 시스템의 복잡성을 알 필요 없이 간단한 인터페이스를 통해 시스템에 접근할 수 있다.
- 다른 객체에 대한 접근을 제어하거나 중재하는 역할을 하는 대리자(Proxy)를 제공하는 패턴
- 원본 객체에 대한 접근을 제어, 보안 검사, 로깅, 캐싱, 지연 로딩 등의 추가 기능을 제공할 수 있다.
- 클래스의 집합을 두 개의 추상화와 구현으로 분리하는 패턴
- 인터페이스와 구현을 별도의 클래스로 분리하여 각각 독립적으로 변경할 수 있다.
- 객체를 공유하여 메모리 사용량을 줄이고 성능을 향상시키기 위한 패턴
- 많은 수의 유사한 객체를 생성해야 할 때 사용된다.
클래스 패턴 (Class Patterns)
- 클래스 간의 상속을 통해 구현되는 패턴
- 컴파일 타임에 관계가 결정된다.
- 팩토리 메서드, 어댑터, 템플릿 메서드, 인터프리터 등
객체 패턴 (Object Patterns)
- 객체 간의 구성(composition)을 통해 구현되는 패턴
- 구성을 통해 재사용이 가능하다.
- 런타임에 객체들이 결합된다.
- 싱글턴, 추상 팩토리, 전략, 옵저버, 반복자, 상태, 커맨드, 복합체, 데코레이터, 퍼사드, 비지터, 메멘토, 프록시
역할 사슬, 미디에이터, 브리지, 플라이웨이트, 프로토타입, 빌더