{{위키데이터 속성 추적}}
'''소프트웨어 디자인 패턴'''({{lang|en|software design pattern}})은 [[소프트웨어 공학]]의 [[소프트웨어 디자인]]에서 특정 문맥에서 공통적으로 발생하는 문제에 대해 재사용 가능한 해결책이다. 소스나 기계 코드로 바로 전환될수 있는 완성된 디자인은 아니며, 다른 상황에 맞게 사용될 수 있는 문제들을 해결하는데에 쓰이는 서술이나 템플릿이다. 디자인 패턴은 프로그래머가 어플리케이션이나 시스템을 디자인할 때 공통된 문제들을 해결하는데에 쓰이는 형식화 된 가장 좋은 관행이다.

== 역사 ==
건축적 개념으로서의 패턴은 [[크리스토퍼 알렉산더]](1977/79)가 창안하였다. 1987년, [[켄트 벡]]과 [[워드 커닝햄]]은 프로그래밍, 구체적으로는 [[패턴 언어]]에 패턴을 적용하는 개념에 관한 실험을 시작했으며 그 해 [[OOPSLA]] 콘퍼런스에서 자신들의 결과를 제시하였다.<ref name = "Smith1987">{{콘퍼런스 인용
 | last = Smith
 | first = Reid
 | title = Panel on design methodology
 | conference = [[OOPSLA]] '87 Addendum to the Proceedings
 | doi = 10.1145/62138.62151
 |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."''</ref><ref name = "Beck1987">{{콘퍼런스 인용
 | last = Beck
 | first = Kent
 | authorlink = Kent Beck
 | authorlink2 = Ward Cunningham | first2 = Ward | last2 = Cunningham
 | title = Using Pattern Languages for Object-Oriented Program
 | conference = [[OOPSLA]] '87 workshop on ''Specification and Design for Object-Oriented Programming''
 | url = http://c2.com/doc/oopsla87.html
 |date=September 1987
 | accessdate = 2006-05-26}}</ref> 그 뒤 여러 해에 걸쳐 벡과 커닝햄 등은 이 작업을 계속 진행하였다.

디자인 패턴은 이른바 사인방(Gang of Four)이 쓴 [[디자인 패턴 (책)|''Design Patterns: Elements of Reusable Object-Oriented Software'']]라는 책이 1994년 출판된 이후 인기를 끌었다.

== 분류 및 목록 ==
디자인 패턴은 원래 여러 분류로 그룹화되었다: [[생성 패턴]], [[구조 패턴]], [[행동 패턴]].

=== [[생성 패턴]] ===
{| class="wikitable"
|-
! 이름
! 《[[디자인 패턴 (책)|디자인 패턴]]》에서
! 《[[코드 컴플리트]]》에서<ref name="McConnell2004">{{서적 인용
 | title = Code Complete
 | first = Steve
 | last = McConnell
 | authorlink = Steve McConnell
 |date=June 2004
 | publisher = [[:en:Microsoft Press]]
 | isbn = 978-0-7356-1967-8
 | chapter = Design in Construction
 | quote = Table 5.1 Popular Design Patterns
 | edition = 2nd
 | page = [https://archive.org/details/codecomplete0000mcco/page/104 104]
| title-link = Code Complete
 }}</ref>
! 기타
|-
| [[추상 팩토리 패턴|추상 팩토리]]
| {{yes}}
| {{yes}}
| {{n/a}}
|-
| [[빌더 패턴|빌더]]
| {{yes}}
| {{no}}
| {{n/a}}
|-
| [[의존성 주입]]
| {{no}}
| {{no}}
| {{n/a}}
|-
| [[팩토리 메서드 패턴|팩토리 메서드]]
| {{yes}}
| {{yes}}
| {{n/a}}
|-
| [[지연된 초기화]]
| {{no}}
| {{no}}
| {{yes|{{abbr|PoEAA|Patterns of Enterprise Application Architecture}}<ref name = "PoEAA">
{{서적 인용
 | first = Martin
 | last = Fowler
 | authorlink = Martin Fowler (software engineer)
 | year = 2002
 | title = Patterns of Enterprise Application Architecture
 | publisher = [[:en:Addison-Wesley]]
 | isbn = 978-0-321-12742-6
 | url = http://martinfowler.com/books.html#eaa
}}</ref>}}
|-
| [[멀티턴 패턴|멀티턴]]
| {{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"
|-
! 이름
! 《[[디자인 패턴 (책)|디자인 패턴]]》에서
! 《[[코드 컴플리트]]》에서<ref name="McConnell2004" />
! 기타
|-
| [[어댑터 패턴|어댑터]], 래퍼(Wrapper), 변환기(Translator)
| {{yes}}
| {{yes}}
| {{n/a}}
|-
| [[브리지 패턴|브리지]]
| {{yes}}
| {{yes}}
| {{n/a}}
|-
| [[컴포지트 패턴|컴포지트]]
| {{yes}}
| {{yes}}
| {{n/a}}
|-
| [[데코레이터 패턴|데코레이터]]
| {{yes}}
| {{yes}}
| {{n/a}}
|-
| 확장 객체(Extension object)
| {{no}}
| {{no}}
| {{yes|Agile Software Development, Principles, Patterns, and Practices<ref name="Agile Software Development">
{{서적 인용
 | last = C. Martin
 | first = Robert
 | title = Agile Software Development, Principles, Patterns, and Practices
 | page = 408
 | chapter = 28. Extension object
 | year = 2002
 | isbn = 978-0135974445
 | publisher = }}</ref>}}
|-
| [[퍼사드 패턴|퍼사드]]
| {{yes}}
| {{yes}}
| {{n/a}}
|-
| [[플라이웨이트 패턴|플라이웨이트]]
| {{yes}}
| {{no}}
| {{n/a}}
|-
| [[프론트 컨트롤러]]
| {{no}}
| {{no}}
| {{yes|
{{abbr|J2EE Patterns|Core J2EE Patterns: Best Practices and Design Strategies (2nd Edition)}}<ref name = "J2EE Patterns">
{{서적 인용
 | first = Deepak
 | last = Alur
 | first2 = John | last2 = Crupi | first3 = Dan | last3 = Malks
 | year = 2003
 | title = Core J2EE Patterns: Best Practices and Design Strategies
 | page = 166
 | publisher = [[:en:Prentice Hall]]
 | isbn = 978-0-13-142246-9
 | url = http://www.corej2eepatterns.com
}}</ref>
{{abbr|PoEAA|Patterns of Enterprise Application Architecture}}<ref name = "PoEAA2">
{{서적 인용
 | first = Martin
 | last = Fowler
 | authorlink = Martin Fowler (software engineer)
 | year = 2002
 | title = Patterns of Enterprise Application Architecture
 | page = 344
 | publisher = [[:en:Addison-Wesley]]
 | isbn = 978-0-321-12742-6
 | url = http://martinfowler.com/books.html#eaa
}}</ref>}}
|-
| [[마커 인터페이스 패턴|마커]]
| {{no}}
| {{no}}
| {{yes|[[조슈아 블로치|이펙티브 자바]]<ref name="EffectiveJava">
{{서적 인용
 | last = Bloch
 | first = Joshua
 | title = Effective Java (Second edition)
 | page = [https://archive.org/details/effectivejava00bloc_0/page/179 179]
 | chapter = Item 37: Use marker interfaces to define types
 | year = 2008
 | isbn = 978-0-321-35668-0
 | publisher = Addison-Wesley
 | url = https://archive.org/details/effectivejava00bloc_0/page/179
 }}</ref>}}
|-
| [[모듈 패턴|모듈]]
| {{no}}
| {{no}}
| {{n/a}}
|-
| [[프록시 패턴|프록시]]
| {{yes}}
| {{no}}
| {{n/a}}
|-
| [[트윈 패턴|트윈]]<ref>{{웹 인용|url=http://www.ssw.jku.at/Research/Papers/Moe99/Paper.pdf |title=Twin – A Design Pattern for Modeling Multiple Inheritance }}</ref>
| {{no}}
| {{no}}
| {{n/a}}

|}

=== [[행동 패턴]] ===
{| class="wikitable"
|-
! 이름
! 《[[디자인 패턴 (책)|디자인 패턴]]》에서
! 《[[코드 컴플리트]]》에서<ref name="McConnell2004" />
! 기타
|-
| [[블랙보드 (디자인 패턴)|블랙보드]]
| {{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]]》에서<ref name="POSA2">{{서적 인용
 | first = Douglas C.
 | last = Schmidt
 | 
 | first2 = Michael | last2 = Stal | first3 = Hans | last3 = Rohnert | first4 = Frank | last4 = Buschmann
 | date = 2000
 | title = Pattern-Oriented Software Architecture, Volume 2: Patterns for Concurrent and Networked Objects
 | publisher = John Wiley & Sons
 | isbn = 978-0-471-60695-6
}}</ref>
! 기타
|-
| [[액티브 오브젝트]]
| {{yes}}
| {{n/a}}
|-
| [[Balking 패턴|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}}
| {{yes|PoEAA<ref name = "PoEAA"/>}}
|-
| [[메시징 패턴|메시징 디자인 패턴 (MDP)]]
| {{no}}
| {{n/a}}
|-
| [[모니터 (동기화)|모니터 객체]]
| {{yes}}
| {{n/a}}
|-
| [[반응자 패턴|반응자]]
| {{yes}}
| {{n/a}}
|-
| [[읽기/쓰기 락 패턴|읽기-쓰기 락]]
| {{no}}
| {{n/a}}
|-
| [[스케줄링 (컴퓨팅)|스케줄러]]
| {{no}}
| {{n/a}}
|-
| [[스레드 풀 패턴|스레드 풀]]
| {{no}}
| {{n/a}}
|-
| [[스레드 특화 스토리지]]
| {{yes}}
| {{n/a}}
|}

== 같이 보기 ==
* [[디자인 패턴 (책)]]

== 각주 ==
{{각주}}

{{디자인 패턴(소프트웨어)}}
{{전거 통제}}

[[분류:소프트웨어 디자인 패턴| ]]
[[분류:소프트웨어 개발]]