디자인 패턴
디자인 패턴은 프로그램을 개발하는 과정에서 빈번하게 발생하는 디자인 문제를 정리해 상황에 따라 간편하게 적용할 수 있게 정리한 것
용도에 따라
생성 패턴
행위 패턴
구조 패턴
으로 구성됩니다.
생성 패턴 :) 추빌팩프싱
- 객체 인스턴스 생성에 관여
- 추상 팩토리 패턴 (Abstract Factory)
- 구체적인 클래스에 의존하지 않고, 연관된 객체들을 그룹으로 생성
- 빌더 패턴 (Builder)
- 객체를 조립하여 생성
- 생성과 구현 분리해서 복잡한 객체를 생성
- 팩토리 메소드 패턴 (Factory Method)
- 상위 클래스에서 인터페이스 정의하고, 서브 클래스가 실제 생성
- 부모 클래스에 알려지지 않은 구체 클래스를 생성하는 패턴
- 자식 클래스가 어떤 객체를 생성할지를 결정하도록 하는 패턴
- 부모 클래스 코드에 구체 클래스 이름을 감추기 위한 방법으로도 사용
- 프로토타입 패턴 (Prototype)
- prototype을 먼저 생성하고 이를 복제하여 객체를 생성
- 싱글톤 패턴 (Singleton)
- 객체의 인스턴스는 오직 하나만 가짐
- 하나의 객체를 생성해 어디든 참조할 수 있으나 동시 참조 불가
행위 패턴 :) 책방커반메옵템상전인중
- 클래스나 객체들의 상호작용 패턴화
- 책임 연쇄 패턴 (Chain of Responsibility)
- 한 객체가 요청을 처리하지 못하면 다음 객체로 넘어가는 패턴
- 한 요청을 2개 이상의 객체에서 처리
- 방문자 패턴 (Visitor)
- 필요한 기능은 해당 클래스에 방문해서 처리하는 패턴
- 객체의 구조는 변경하지 않으면서 기능만 따로 추가하거나 확장할 때 사용
- 커맨드 패턴 (Command)
- 요청을 객체로 캡슐화하여, 요청이 들어오면 그에 맞는 서브 클래스 실행
- 반복자 패턴 (Iterator)
- 접근이 잦은 객체에 대해 동일한 인터페이스를 사용하도록 하는 패턴 (내부 노출 없이 순차적 접근 가능)
- 내부구조를 노출하지 않고, 복합 객체의 원소를 순차적으로 접근 가능하게 해주는 행위 패턴
- 메멘토 패턴 (Memento)
- 객체를 해당 시점의 상태로 되돌릴 수 있는 기능을 제공하는 패턴 (Ctrl+Z)
- 옵저버 패턴 (Observe)
- 관찰대상의 변화를 탐지하는 패턴
- 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고 자동으로 내용이 갱신되는 방식으로 일 대 다 의존성을 가짐
- 서로 상호작용을 하는 객체 사이에서는 가능하면 느슨하게 결합하는 디자인을 사용
- 템플릿 메소드 패턴 (Template Method)
- 상위 클래스에서 기능 골격을 정의하고, 하위 클래스에서 세부 처리 방법을 구체화하는 패턴
- (팩토리 메소드 - 상위 클래스에서 인터페이스 정의 후 하위 클래스에서 실제 생성)
- 상태 패턴 (State)
- 객체의 상태에 따라 동일한 동작을 다르게 처리해야 할 때 사용하는 패턴
- 객체의 상태를 캡슐화하고, 이를 참조해 동작을 다르게 처리
- 전락 패턴 (Strategy)
- 클라이언트에 영향을 받지 않는 독립적인 알고리즘을 선택하는 패턴
- 동일한 계열의 알고리즘을 캡슐화하고, 전략을 선택해 사용
- 행위를 클래스로 캡슐화해 동적으로 행위를 자유롭게 변환
- 인터프리터 패턴 (Interpreter)
- 여러 언어 구문을 해석할 수 있게 해주는 패턴
- 중재자 패턴 (Mediator)
- 객체 사이에 중재자를 두어 의존성을 줄이는 패턴
구조 패턴 :) 어브컴데퍼플프
- 여러 객체를 모아 구조화시키는 패턴
- 어댑터 패턴 (Adapter)
- 기존 클래스 재사용할 수 있도록 중간에서 맞춰줌
- 호환성 없는 클래스의 인터페이스를 이용할 수 있게 변환
- 브리지 패턴 (Bridge)
- 구현부에서 추상 계층 분리하여 결합도를 낮춘 패턴 (기능과 구현을 두 개의 별도 클래스로 구현)
- 컴포지트 패턴 (Composite)
- 객체들의 관계를 트리 구조로 구성
- 복합 객체와 단일 객체를 동일하게 취급
- 데코레이터 패턴 (Decorator)
- 상속을 사용하지 않고도 객체의 기능을 동적으로 확장해주는 패턴 (상속의 대안)
- 객체 결합을 통해 기능 확장
- 퍼싸드 패턴 (Facade)
- 복잡한 시스템에 단순한 인터페이스를 제공해 접근성을 높인 패턴
- ex) 리모컨
- 플라이웨이트 패턴 (Flyweight)
- 객체를 공유해서 사용함으로써 메모리 절약하는 패턴
- 프록시 패턴 (Proxy)
- 접근이 어려운 객체를 연결해주는 인터페이스 역할을 수행하는 패턴