1. 프로그래밍에서 디자인 패턴이란?

프로그래밍을 하다 보면 반드시 라이브러리, 패키지, 모듈, 프레임워크 같은 것들을 사용합니다.

이 프로그래밍을 도와주는 도구들을 자유자재로 활용하려면 도구의 정확한 용도와 장단점, 핵심적인 특성, 사용시 주의사항 등을 제대로 파악하고 있어야 합니다.

라이브러리가 없다면 모든 프로그래머들이 시행 착오를 반복하면서 클래스나 함수, 메소드 등을 직접 만들어 프로그래밍 해야 합니다.

하지만 우리가 일상적으로 접하는 문제 중 사앙수는 다른 많은 이들이 접했던 문제이며, 효율적인 해결법이 나와 있습니다. 

 

 

디자인 패턴은 프로그램을 개발하는 과정에서 빈번하게 발생하는 디자인 상의 문제를 정리해서, 상황에 따라 간편하게 적용해서 쓸 수 있는 패턴 형태로 만든 것입니다.

 

 

 

 

 

 

 

2. 디자인 패턴 종류

수많은 종류의 디자인 패턴이 있다.

 

 

- 스트래티지 패턴 (strategy pattern)

교환 가능한 행동을 캡슐화하고 위임을 통해서 어떤 행동을 사용할지 결정한다.

 

- 옵저버 패턴 (observer pattern)

상태가 변경되면 다른 객체들한테 연락을 돌릴 수 있게 한다.

 

- 데코레이터 패턴 (decorator pattern)

객체를 감싸서 새로운 행동을 제공한다.

 

- 팩토리 패턴 (factory pattern)

생성할 구상 클래스를 서브클래스에서 결정한다.

 

- 추상 팩토리 패턴 (AbstractFactory pattern)

클라이언트에서 구상 클래스를 지정하지 않으면서도 일군의 객체를 생성할 수 있도록 한다.

 

- 싱글턴 패턴 (singleton pattern)

딱 한 객체만 생성되도록 한다.

 

- 커맨드 패턴 (command pattern)

요청을 객체로 감싼다.

 

- 어댑터 패턴 (adaptor pattern)

객체를 감싸서 다른 인터페이스를 제공한다.

 

- 퍼사드 패턴 (facade pattern)

일련의 클래스에 대해서 간단한 인터페이스를 제공한다.

 

- 템플릿 메소드 패턴 (template method pattern)

알고리즘의 개별 단계를 구현하는 방법을 서브클래스에서 결정한다.

 

- 이터레이터 패턴 (iterator pattern)

컬렉션이어떤 식으로 구현되었는지 드러내진 않으면서도 컬렉션 내에 있는 모든 객체에 대해 반복 작업을 처리할 수 있게 한다.

 

- 컴포지트 패턴 (composite pattern)

클라이언트에서 객체 컬렉션과 개발 객체를 똑같이 다룰 수 있도록 한다.

 

- 스테이트 패턴 (state pattern)

알고리즘의 개별 단계를 구현하는 방법을 서브클래스에서 결정한다.

 

- 프록시 패턴 (proxy pattern)

객체를 감싸서 그 객체에 대한 접근을 제어한다.

 

- 컴파운드 패턴 (compound pattern)

반복적으로 생길 수 있는 일반적인 문제를 해결하기 위한 용도로 두 개 이상의 패턴을 결합해서 사용한는 것

 

 

 

 

 

 

 

- 브리지 패턴 (bridge pattern)

구현 뿐만 아니라 추상화된 부분까지 변경시켜야 하는 경우

 

- 빌더 패턴 (builder pattern)

제품을 여러 단계로 나눠서 만들 수 있도록 제품 생산 단계들을 캡슐화할 때

 

- 역할 사슬 패턴 (chain of responsibility pattern)

한 요청을 두 개 이상의 객체에서 처리하고 싶을 때

 

- 플라이웨이트 패턴 (flyweight pattern)

어떤 클래스의 인스턴스 한 개만가지고 여러 개의 "가상 인스턴스"를 제공하고 싶을 때

 

- 인터프리터 패턴 (Interpreter pattern)

어떤 언어에 대한 인터프리터를 만들 때

 

- 미디에이터 패턴 (mediator pattern)

서로 관련된 객체 사이의 복잡한 통신과 제어를 한 곳으로 집중시키고자 할 때

 

- 메멘토 패턴 (memento pattern) 

객체를 이전의 상태로 복구시켜야 하는 경우

 

- 프로토타입 패턴 (prototype pattern)

어떤 클래스의 인스턴스를 만드는 것이 자원/시간을 많이 잡아먹거나 복잡한 경우

 

- 비지터 패턴 (visitor pattern)

다양한 객체에 새로운 기능을 추가해야 하는데 캡슐화가 별로 중요하지 않은 경우