💡 디자인 패턴 (Design Pattern)
- 모듈 간의 관계 및 인터페이스를 설계할 때 참조할 수 있는 전형적인 해결 방식 또는 예제
- '바퀴를 다시 발명하지 마라(Don't reinvent the wheel)'
- 개발 과정 중에 문제가 발생하면, 새로운 해결책 구상보다
문제에 해당하는 디자인 패턴을 참고하여 적용하는 것이 더욱 효율적임
- GoF 디자인패턴 = 생성 패턴 / 구조 패턴 / 행위 패턴
💡 생성 패턴 (Creational Pattern)
클래스나 객체의 생성과 참조 과정을 정의하는 패턴 [5가지]
- Abstract Factory (추상 팩토리)
- 구체적인 클래스에 의존하지 X
- 서로 연관되거나 의존적인 객체들의 조합을 만드는 인터페이스 제공
- 연관된 서브 클래스를 묶어 한 번에 교체 가능
- Builder (빌더)
- 작게 분리된 복잡한 인스턴스를 조립하여 객체 생성
- 객체의 생성과 표기를 분리하여, 동일한 객체 생성에서도 서로 다른 결과 가능
- Factory Method (팩토리 메소드)
- 객체 생성을 서브 클래스에서 처리하도록 분리하여 캡슐화
- 상위 클래스 = 인터페이스 정의 / 하위 클래스 = 인터페이스 생성
- Prototype (프로토타입)
- 원본 객체를 복제하여 객체 생성
- 처음부터 일반적인 원형을 만들어 놓고, 복사한 후 필요한 부분만 수정하여 사용
- Singleton (싱글톤)
- 한 클래스에 한 객체만 존재하도록 제한
- 여러 프로세스가 동시에 참조 불가능
💡 구조 패턴 (Structural Pattern)
구조가 복잡한 시스템을 개발하기 쉽도록
클래스나 객체들을 조합하여 더 큰 구조로 만드는 패턴 [7가지]
- Adapter (어댑터)
- 기존의 클래스를 재사용할 수 있도록 중간에서 맞춰주는 인터페이스로 변환
- Bridge (브리지)
- 구현부에서 추상층을 분리하여, 서로가 독립적으로 확장 가능하도록 구성
- 기능 클래스와 구현 클래스를 연결함
- Composite (컴포지트)
- 객체들의 관계를 트리 구조로 구성하여 부분-전체 계층 표현
- 복합 객체와 단일 객체를 구분 없이 다루고자 할 때 사용
- Decorator (데코레이터)
- Facade (퍼싸드)
- 복잡한 서브 클래스를 피해 더 상위에 인터페이스를 구성
- 서브 클래스들의 기능을 간편하게 사용할수 있도록 함
- 서브 클래스들 사이에 통합 인터페이스를 제공하는 Wrapper 객체 필요
- Flyweight (플라이웨이트)
- 여러 개의 가상 인스턴스 제공함으로써 메모리 절감 클래스의 경량화 목적
- 인스턴스를 매번 생성하지 X, 가능한 공유해서 사용함
- 다수의 유사 객체 생성 및 조작 시 유용하게 사용 가능
- Proxy (프록시)
- 접근이 어려운 객체와 이를 연결하려는 객체 사이에서 인터페이스 역할 수행
- 네트워크 연결, 메모리의 대용량 객체로의 접근 등에 주로 이용
💡 행위 패턴 (Behavioral Pattern)
클래스나 객체들이 서로 상호작용하는 방법이나 책임 분배 방법을 정의하는 패턴 [11가지]
- Chain of Responsibility (책임 연쇄)
- 요청 처리 가능 객체가 여러개 존재하여 한 객체가 처리 못하면 다음 객체로 넘어감
- 요청 처리 객체들이 고리로 묶여 있어서, 요청 해결까지 책임 넘김
- Command (커맨드)
- 요청을 객체 형태로 캡슐화하여 재이용 or 취소 가능하도록 요청에 필요한 정보를 저장하거나 로그에 남기는 패턴
- 요청에 사용되는 각종 명령어들을 추상 클래스 & 구체 클래스로 분리하여 단순화
- Interpreter (인터프리터)
- 언어에 문법 표현을 정의
- SQL or 통신 프로토콜 개발 시 사용
- Iterator (반복자)
- 접근이 잦은 객체에 대해 동일한 인터페이스를 사용하도록 함
- 내부 표현 방법의 노출 없이 순차 접근 가능
- Mediator (중재자)
- 수많은 객체들 간 복잡한 상호작용(인터페이스)을 캡슐화하여 객체로 정의함
- 객체 사이의 의존성을 줄여 결합도 감소 가능
- Memento (메멘토)
- 객체를 이전 상태로 복구할 수 있도록 작업취소 요청
- Observer (옵서버)
- 한 객체의 상태가 변할 시 객체에 상속되어 있는 다른 객체들에게 변화된 상태 전달
- 분산 시스템 간 생성, 발생, 수신 시 사용
- State (상태)
- 객체의 상태에 따라 동일한 동작을 다르게 처리해야 할 때 사용
- 객체의 상태를 캡슐화하고 이를 참조하게 함
- Strategy (전략)
- 동일 알고리즘을 개별적으로 캡슐화하여 필요할 때 상호 교환 가능
- Template Method (템플릿 메소드)
- 상위 클래스 = 골격 정의 / 하위 클래스 = 세부 처리를 구체화
- 유사한 서브 클래스를 묶어 공통된 내용을 상위 클래스에서 정의
- Visitor (방문자)
- 각 클래스들의 데이터 구조에서 처리 기능을 분리하여 별도의 클래스로 구성
- 해당 클래스의 메서드가 각 클래스를 방문하며 특정 작업 수행