소프트웨어 디자인 과정에서 자주 발생하는 문제들에 대한 전형적인 해결책
디자인 패턴을 사용해야 하는 이유?
- 반복적으로 나타나는 문제를 해결하기 용이
- 효율적으로 의사소통하는 데 사용할 수 있는 공통 언어를 정의
디자인 패턴의 종류
생성 패턴들은 기존 코드의 재활용과 유연성을 증가시키는 객체 생성 메커니즘들을 제공합니다.
구조 패턴은 구조를 유연하고 효율적으로 유지하면서 객체와 클래스를 더 큰 구조로 조합하는 방법을 설명합니다.
행동 패턴은 객체 간의 효과적인 의사소통과 책임 할당을 처리합니다.
생성패턴
1. Singleton(싱글톤 패턴)

-클래스에 인스턴스가 하나만 있도록 하면서 이 인스턴스에 대한 전역 접근(액세스) 지점을 제공하는 생성패턴
2. Factory Method(팩토리 메서드 패턴)

- 부모 클래스에서 객체들을 생성할 수 있는 인터페이스를 제공하지만, 자식 클래스들이 생성될 객체들의 유형을 변경할 수 있도록 하는 생성 패턴
- 객체를 생성하기 위한 인터페이스를 정의하고, 서브클래스에서 어떤 클래스의 인스턴스를 생성할지 결정하는 패턴이다.
3. Abstract Factory(추상 팩토리 패턴)

- 관련된 객체들의 집합을 생성하는 인터페이스를 제공하며, 구체적인 팩토리 클래스를 통해 객체 생성을 추상화하는 패턴이다.
4. Builder(빌더 패턴)

- 복잡한 객체의 생성 과정을 단순화하고, 객체를 단계적으로 생성하며 구성하는 패턴이다.
5. Prototype(프로토타입 패턴)

- 기존 객체를 복제하여 새로운 객체를 생성하는 패턴으로, 기존 객체를 템플릿으로 사용하는 패턴이다.
구조패턴
1. Adapter(어댑터 패턴)

- 호환되지 않는 인터페이스를 가진 객체들이 협업
- 인터페이스 호환성을 제공하지 않는 클래스를 사용하기 위해 래퍼(Wrapper)를 제공하는 패턴
2. Bridge(브릿지 패턴)

- 큰 클래스 또는 밀접하게 관련된 클래스들의 집합을 두 개의 개별 계층구조(추상화 및 구현)로 나눈 후 각각 독립적으로 개발
3. Composite(복합체 패턴)

-객체들을 트리 구조들로 구성한 후, 이러한 구조들과 개별 객체들처럼 작업할 수 있도록 하는 구조 패턴
4. Decorator(데코레이터 패턴)

- 객체에 동적으로 새로운 기능을 추가하여 객체를 확장할 수 있는 패턴이다.
5. Facade(퍼사드 패턴)

- 라이브러리에 대한, 프레임워크에 대한 또는 다른 클래스들의 복잡한 집합에 대한 단순화된 인터페이스를 제공
- 서브시스템을 더 쉽게 사용할 수 있도록 단순한 인터페이스를 제공
6. Flyweight(플라이웨이트 패턴)

- 각 객체에 모든 데이터를 유지하는 대신 여러 객체들 간에 상태의 공통 부분들을 공유하여 사용할 수 있는 RAM에 더 많은 객체들을 포함할 수 있도록 하는 구조 패턴
- 공유 가능한 객체를 통해 메모리 사용을 최적화하는 패턴
7. Proxy(프록시 패턴)

- 다른 객체에 대한 대리자(Proxy)를 제공하여 접근 제어, 지연 로딩 등을 구현하는 패턴
- 프록시는 원래 객체에 대한 접근을 제어하므로, 당신의 요청이 원래 객체에 전달되기 전 또는 후에 무언가를 수행할 수 있도록 합니다.
행위패턴
1. Observer(옵저버 패턴)

- 여러 객체에 자신이 관찰 중인 객체에 발생하는 모든 이벤트에 대하여 알리는 구독 메커니즘을 정의할 수 있도록 하는 행동패턴
- 객체 간의 일대다 종속 관계를 정의하여 한 객체의 상태 변경이 다른 객체들에게 알려지도록 한다.
2. Strategy(전략 패턴)

- 알고리즘을 정의하고, 실행 중에 선택할 수 있게 한다.
3. Command(커맨드 패턴)

- 요청을 객체로 캡슐화하여 요청을 매개변수화 하고, 요청을 큐에 저장하거나 로깅하고 실행을 지연시킨다.
4. State(상태 패턴)

- 객체의 상태를 캡슐화하고, 상태 전환을 관리한다.
- 유한 상태 기계 개념과 밀접하게 관련
5. Chain of Responsibility(책임 연쇄 패턴)

- 각 핸들러는 요청을 받으면 요청을 처리할지 아니면 체인의 다음 핸들러로 전달할지를 결정
- 요청을 보내는 객체와 이를 처리하는 객체를 분리하여, 다양한 처리자 중 하나가 요청을 처리한다.
6. Visitor(방문자 패턴)

- 객체 구조를 순회하면서 다양한 연산을 수행할 수 있게 한다.
7. Interpreter(인터프리터 패턴)
- 언어나 문법에 대한 해석기를 제공하여, 주어진 언어로 표현된 문제를 해결하는 패턴이다.
8. Memento(메멘토 패턴)

- 객체의 구현 세부 사항을 공개하지 않으면서 객체의 내부 상태를 저장하고 복원할 수 있는 기능을 제공하는 패턴

- 객체 간의 직접 통신을 제한하고 중재자 객체를 통해서만 협력 (객체 간 의존 관계를 줄인다)
- 객체 간의 상호 작용을 캡슐화하여, 객체 간의 직접적인 통신을 방지하는 패턴
10. Template Method(템플릿 메서드 패턴)

- 자식 클래스들이 알고리즘의 특정 단계들을 오버라이드(재정의)할 수 있도록 하는 행동 패턴
- 알고리즘의 구조를 정의하면서 하위 클래스에서 각 단계의 구현을 제공하는 패턴
11. Iterator(이터레이터 패턴)

- 컬렉션의 요소들의 기본 표현(리스트, 스택, 트리 등)을 노출하지 않고 컬렉션 내의 요소들에 접근하는 방법을 표준화하여 컬렉션의 내부 구조에 독립적으로 접근할 수 있는 패턴
(출처) : https://refactoring.guru/ko/design-patterns