디자인 패턴
- 각 모듈의 세분화된 역할이나 모듈들 간의 인터페이스와 같은 코드를 작성하는 수준의 세부적인 구현방법으로 설계할 때 참조할 수 있는 전형적인 해결 방식 또는 예제를 의미한다
디자인 패턴의 장점
- 범용적인 코딩 스타일로 구조 파악 용이
- 객체지향 설계 및 구현의 생산성을 높이는 데 적합함
- 검증된 구조의 재사용을 통해 개발 시간과 비용이 절약
디자인 패턴 유형
- 생성 패턴, 구조 패턴, 행위 패턴 (Gof)
생성 패턴
- 객체의 생성 방식을 다루며 주요 목적은 객체 생성 프로세스를 추상화하여 응용 프로그램의 유연성과 확장성을 향상 시키는 것
- 새로운 객체를 생성하고 조합하는 방법에 대한 일반적인 해결책을 제시
생성 패턴명
- 추상 팩토리 (abstact factory): 구체적인 클래스에 의존하지 않고 인터페이스를 통해 서로 연관/의존하는 객체들의 그룹으로 생성하여 추상적으로 표현함
- 빌더 (builder): 작게 분리된 인스턴스를 건축 하듯이 조합하여 객체를 생성
- 팩토리 메소드 (factory method): 객체 생성을 서브 클래스에서 처리하도록 분리하여 캡슐화한 패턴으로 상위 클래스에서 인터페이스만 정의하고 실제 생성은 서브클래스가 담당. 가상 생성자 (virtual constructor) 패턴이라고도 함
- 프로토타입 (prototype): 원본 객체를 복제하는 방법으로 객체를 생성하는 패턴
- 싱글톤 (singleton): 하나의 객체를 생성하면 생성된 객체를 어디서든 참조할 수 있지만 여러 프로세스가 동시에 참조할 수 없음
구조 패턴
- 소프트웨어의 구조를 개선하고 유지보수를 용이하게 만드는 패턴
- 프로그램의 다양한 구성 요소들 간의 관계를 조직화하고 코드의 재사용성을 높이며 유연성을 확보하는 데 중요한 역할을 함
구조 패턴명
- 어댑터 (adapter): 호환성이 없는 클래스들의 인터페이스를 다른 클래스가 이용할 수 있도록 변환해주는 패턴
- 브리지 (bridge): 구현부에서 추상층을 분리하여 서로가 독립적으로 확장할 수 있도록 구성한 패턴
- 컴포지트 (composite): 여러 객체를 가진 복합 객체와 단일 객체를 구분 없이 다루고자 할 때 사용하는 패턴, 객체 관계를 트리 구조로 구성함
- 데코레이더 (decorator): 객체 간의 결합을 통해 능동적으로 기능들을 확장할 수 있는 패턴으로 임의의 객체에 부가적인 기능을 추가하기 위해 다른 객체들을 덧붙이는 방식으로 구현함
- 퍼싸드 (facade): 복잡한 서브 클래스들을 피해 더 상위에 인터페이스를 구성함으로써 서브 클래스들의 기능을 간편하게 사용할 수 있도록 하는 패턴
- 플라이웨이트 (flyweight): 인스턴스가 필요할 때마다 매번 생성하는 것이 아니고 가능한 한 공유해서 사용함으로써 메모리를 절약하는 패턴
- 프록시 (proxy): 접근이 어려운 객체와 여기에 연결하려는 객체 사이에서 인터페이스 역할을 수행하는 패턴 / 대리 객체 / 정보 은닉화 가능
행위 패턴
- 객체 간의 상호작용을 중심으로 설계되며 객체들간의 역할,책임,행동에 대한 패턴을 제공함
- 애플리케이션의 행위를 구조화하고 관리하는 데 도움이 됨
행위 패턴명 (키워드만)
- 책임 연쇄 (chain of responsibility): 체인 형태 / 둘 이상의 객체
- 커멘드 (command): 요청을 객체의 형태로 캡슐화 / 요청자 / 처리자
- 인터프리터 (interpreter): 언어 / 해석 / 문법 정의
- 반복자 (iterator): 요소들을 순차적 접근 / 동일한 인터페이스
- 중재자 (mediator): 상호작용
- 메멘토 (memento): 객체의 내부 상태를 객체화 / 저장하고 복윈 / ctrl + z
- 옵서버 (observer): 상태 변화 관찰 / 알림
- 상태 (state): 객체 내부 상태 -> 객체 동작 다르게 처리
- 전략 (strategy): 알고리즘 / 상호교환
- 템플릿 메소드 (template method): 알고리즘 / 하위 클래스에서 세부 처리 구체화
- 방문자 (visitor): 처리 기능을 분리 / 별도의 클래스