소프트웨어 디자인 패턴

**소프트웨어 디자인 패턴**(software design pattern)은 소프트웨어 공학 소프트웨어 디자인의 특정 문맥에서 공통적으로 발생하는 문제에 대해 재사용 가능한 해결책이다. 소스나 기계 코드로 바로 전환될수 있는 완성된 디자인은 아니며, 다른 상황에 맞게 사용될 수 있는 문제들을 해결하는데에 쓰이는 서술이나 템플릿이다. 디자인 패턴은 프로그래머가 애플리케이션이나 시스템을 디자인할 때 공통된 문제들을 해결하는데에 쓰이는 형식화 된 가장 좋은 관행이다.
# 역사
건축적 개념으로서의 패턴은 크리스토퍼 알렉산더(1977/79)가 창안하였다. 1987년, 켄트 벡과 워드 커닝햄은 프로그래밍, 구체적으로는 패턴 언어에 패턴을 적용하는 개념에 관한 실험을 시작했으며 그 해 OOPSLA 콘퍼런스에서 자신들의 결과를 제시하였다.date=October 1987, *"Ward cautioned against requiring too much programming at, what he termed, 'the high level of wizards.' He pointed out that a written 'pattern language' can significantly improve the selection and application of abstractions. He proposed a 'radical shift in the burden of design and implementation' basing the new methodology on an adaptation of Christopher Alexander's work in pattern languages and that programming-oriented pattern languages developed at Tektronix has significantly aided their software development efforts."*accessdate = 2006-05-26 그 뒤 여러 해에 걸쳐 벡과 커닝햄 등은 이 작업을 계속 진행하였다. 디자인 패턴은 이른바 사인방(Gang of Four)이 쓴 *Design Patterns: Elements of Reusable Object-Oriented Software*라는 책이 1994년 출판된 이후 인기를 끌었다.
# 분류 및 목록
디자인 패턴은 원래 여러 분류로 그룹화되었다: 생성 패턴, 구조 패턴, 행동 패턴.
## 생성 패턴
{| class="wikitable" |- ! 이름 ! 《디자인 패턴》에서 ! 《코드 컴플리트》에서title-link = Code Complete ! 기타 |- | 추상 팩토리 | yes | yes | n/a |- | 빌더 | yes | no | n/a |- | 의존성 주입 | no | no | n/a |- | 팩토리 메서드 | yes | yes | n/a |- | 지연된 초기화 | no | no | url = http://martinfowler.com/books.html#eaa |- | 멀티턴 | no | no | n/a |- | 객체 풀 | no | no | n/a |- | 프로토타입 | yes | no | n/a |- | 자원의 획득은 초기화이다(Resource Acquisition Is Initialization, RAII) | no | no | n/a |- | 싱글턴 | yes | yes | n/a |}
## 구조 패턴
{| class="wikitable" |- ! 이름 ! 《디자인 패턴》에서 ! 《코드 컴플리트》에서 ! 기타 |- | 어댑터, 래퍼(Wrapper), 변환기(Translator) | yes | yes | n/a |- | 브리지 | yes | yes | n/a |- | 컴포지트 | yes | yes | n/a |- | 데코레이터 | yes | yes | n/a |- | 확장 객체(Extension object) | no | no | publisher = |- | 퍼사드 | yes | yes | n/a |- | 플라이웨이트 | yes | no | n/a |- | 프론트 컨트롤러 | no | no | url = http://martinfowler.com/books.html#eaa |- | 마커 | no | no | url = https://archive.org/details/effectivejava00bloc_0/page/179 |- | 모듈 | no | no | n/a |- | 프록시 | yes | no | n/a |- | 트윈title=Twin – A Design Pattern for Modeling Multiple Inheritance | no | no | n/a |}
## 행동 패턴
{| class="wikitable" |- ! 이름 ! 《디자인 패턴》에서 ! 《코드 컴플리트》에서 ! 기타 |- | 블랙보드 | no | no | n/a |- | 책임 연쇄 | yes | no | n/a |- | 커맨드 | yes | no | n/a |- | 인터프리터 | yes | no | n/a |- | 반복자 | yes | yes | n/a |- | 중재자 | yes | no | n/a |- | 메멘토 | yes | no | n/a |- | 널 객체 | no | no | n/a |- | 옵서버 또는 발행-구독 모델 | yes | yes | n/a |- | 서번트 | no | no | n/a |- | 사양(Specification pattern) | no | no | n/a |- | 상태 | yes | no | n/a |- | 전략 | yes | yes | n/a |- | 템플릿 메소드 | yes | yes | n/a |- | 비지터 | yes | no | n/a |}
## 동시성 패턴
{| class="wikitable" |- ! 이름 ! 《POSA2》에서isbn = 978-0-471-60695-6 ! 기타 |- | 액티브 오브젝트 | yes | n/a |- | Balking | no | n/a |- | 바인딩 속성 | no | n/a |- | 컴퓨트 커널 | no | n/a |- | 더블 체크 라킹(Double checked locking) | yes | n/a |- | 이벤트 기반 비동기 | no | n/a |- | 가디드 서스펜션(Guarded suspension) | no | n/a |- | 조인 | no | n/a |- | 락 | no | PoEAA |- | 메시징 디자인 패턴 (MDP) | no | n/a |- | 모니터 객체 | yes | n/a |- | 반응자 | yes | n/a |- | 읽기-쓰기 락 | no | n/a |- | 스케줄러 | no | n/a |- | 스레드 풀 | no | n/a |- | 스레드 특화 스토리지 | yes | n/a |}