---
# System prepended metadata

title: 디자인패턴이란?

---

# 디자인패턴이란?
## 개념
디자인 패턴을 활용하면 단지 코드만 ‘재사용’하는 것이 아니라, 더 큰 그림을 그리기 위한 디자인도 재사용할 수 있습니다. 우리가 일상적으로 접하는 문제 중 상당수는 다른 많은 이들이 접했던 문제입니다.


디자인 패턴은 프로그램을 개발하는 과정에서 빈번하게 발생하는 디자인 문제를 정리해서 상황에 따라 간편하게 적용할 수 있게 정리한 것입니다. 잘 활용할 수만 있다면 적지 않은 시간과 노력, 시행착오를 줄일 수 있습니다.

우리 앞에 놓여진 것과 비슷한 문제를 해결하려고 선배들이 시간과 노력을 투자해서 이것저것 시도해 보고, 그중에서 가장 효과적이라고 알려진 방법이 ‘패턴’이라는 이름으로 자리를 잡았기 때문입니다.

 

패턴의 용도에 따라 분류하고 그에 따른 패턴의 종류에 대해 간단히 알아보겠습니다.

논문 'Using Pattern Languages for Object-Oriented Programs(1987)'을 통해 처음 제안.

이후 큰 유명세를 타게 된 것은 23개의 패턴을 수록한 'GoF(Gang of Fours). Design Patterns: Elements of Reusable Object-Oriented Software(1995)'에 의해서이다.
현재는 수천여개의 패턴이 발표되어있다.


## 분류
GoF 디자인 패턴에 따르면 목적에 따라 '생성', '구조', '행위'패턴으로 나눌 수 있습니다. 


| 생성(creational)패턴 | 구조(structural)패턴 | 행위(behavioral)패턴 |
| -------- | -------- | -------- |
| 추상 팩토리(Abstract Factory) <br/> 빌더(Builder) <br/> 팩토리 메서드(Factory Method) <br/> 프로토타입(Prototype) <br/> 싱글톤(Singleton) | 어댑터(Adaptor) <br/> 브릿지(Bridge) <br/> 컴포지트(Composite) <br/> 데코레이터(Decorator) <br/> 파사드(Facade) <br/> 플라이웨이트(Flyweight) <br/> 프록시(Proxy)  | 책임 연쇄(Chain of Responsibility) <br/> 커맨드(Command) <br/> 인터프리  |





# FACADE Pattern(발표 시간 10분)

## 개념
저수준 인터페이스들을 하나의 고수준 인터페이스로 묶어주는 패턴
고수준 인터페이스로 저수준 인터페이스를 통합했다고 하여 '통합 인터페이스'라고 부른다.
클라이언트 객체가 여러 저수준 인터페이스의 동작을 제어하려면 여러 저수준 인터페이스의 메서드들을 일일히 호출해야하는데, 파사드 패턴을 이용하면 고수준 인터페이스의 메서드 호출만으로 한 번에 할 수 있게 된다.

Facade 패턴은 복잡한 서브시스템 내의 인터페이스 집합에 대해 사용자에게 꼭 필요한 획일화된 인터페이스만을 제공한다. Facade가 사전상 의미로 표면, 겉, 외관을 의미하는데 의미 그대로 복잡한 서브시스템은 속으로 숨기고 사용자에게 필요한 인터페이스만 표면으로 보여준다. 이러한 패턴은 사용자와 서브시스템 간의 결합도를 줄여준다.

## 구조 패턴의 한 종류
## 구조 패턴이란?
구조 패턴이란 작은 클래스들의 상속과 합성을 통해 더 큰 클래스를 생성하는 방법을 제공하는 패턴으로, 독립적으로 개발한 클래스들을 마치 하나인 것처럼 사용할 수 있는 패턴이다.
  - Adapter Pattern
  - Bridge Pattern
  - Composite Pattern
  - Decorator Pattern ✅
  - Facade Pattern ✅
  - Flyweight Pattern ✅
  - Proxy Pattern

![](https://hackmd.io/_uploads/SypIrw1L2.png)

그럼 builder pattern은?

## 특징
 - 낮은 결합도: 클라이언트가 서브시스템의 코드를 모르더라도 Facade 클래스를 통해 사용 가능
 - 서브 클래스 직접 접근 가능: Facade 클래스를 통해 서브클래스를 사용할지, 서브클래스를 직접사용할지 선택 가능
 - 
