---
# System prepended metadata

title: 디자인 패턴

---

## 디자인 패턴

### 1. Prototype Pattern

프로토타입 타입은 객체를 생성하는 과정을 최적화하기 위해 사용되는 것으로 기존 객체를 복제하여 생성하는 방식으로 생성 비용을 줄이고 성능을 향상시킬 수 있는 장점이 있다. 따라서 주로 객체 생성 과정이 복잡하거나 비용이 많이 들 때 유용하게 쓰인다.

다른 디자인 패턴에서는 클래스간 종속으로 인해 의존성이 높아지는 이슈가 발생할 우려가 있기 때문에 이런 경우에는 기존 객체와 동일한 정보를 갖는 새로운 객체를 생성하는 것이 간편하고 더욱 안전하여 재사용성을 높이면서 의존성 문제를 해결할 수 있다.

#### 동작 구조
1. 원본 프로토타입을 생성하고 초기화한다.
2. 이후 새로운 객체가 필요할 때, 프로토타입을 이용하여 새로운 객체를 생성한다.
3. 복제된 객체는 프로토타입과 동일한 속성과 메서드를 갖게 된다.

#### 사용 방법
1. 프로토타입 프로토콜 생성
2. 원본 객체를 생성
3. clone() 메서드를 이용하여 새로운 객체를 생성
4. 속성 확인

#### 예시 코드
<프로토타입 프로토콜>
![](https://hackmd.io/_uploads/S1SNcSqlp.png)

<코카콜라 객체>
![](https://hackmd.io/_uploads/rJWN5B9ea.png)

<펩시 객체>
![](https://hackmd.io/_uploads/ByD4qB9ep.png)

<객체 생성 및 복제>
![](https://hackmd.io/_uploads/SkaB9r9la.png)

<실행 결과>
![](https://hackmd.io/_uploads/rkEL5S5l6.png)
위 결과와 같이 기존 객체와 새롭게 생성된 객체는 변경 값에 서로 영향을 주지 않는 것을 확인해 볼 수 있다.

- - -
### 2. Adapter Pattern
클래스의 인터페이스를 사용자의 기호에 맞게 다른 인터페이스로 변환해주는 패턴으로 호환성이 없는 서로 다른 인터페이스를 가진 클래스들이 함께 작동하도록 도와준다.

#### 구성 요소
1. Target 인터페이스
    클라이언트가 사용하려는 인터페이스를 정의, 클라이언트 코드에서 호출됨.
2. Adaptee 클래스
    클라이언트가 원하는 인터페이스를 갖고 있지 않은 클래스.
3. Adapter 클래스
    클라이언트가 Target 인터페이스를 사용할 수 있도록 Adaptee의 메서드를 호출을 변환해준다.
4. Client
    Target 인터페이스를 사용하여 메서드를 호출한다.

#### 사용 방법

#### 예시 코드

- - -
### 3. Bridge Pattern
브릿지 패턴은 크고 복잡한 클래스들을 분리하여 서로 독립적으로 확장 가능한 환경을 만들어 줄 때 사용된다. 이를 통해 강한 의존성을 제거할 수 있다.

#### 구성 요소
1. Abstraction(추상화)
    클라이언트 코드에서 사용되는 인터페이스를 정의한다.
2. Refined Abstraction(재정의된 추상화)
    추상화 계층을 확장한 클래스로, 클라이언트 코드에서 사용된다.
3. Implementor(구현자)
    구현 계층의 인터페이스를 정의, 구체적인 구현 클래스에서 구현된다.
4. Concrete implementor(구체적인 구현체)
    구현자의 실제 구현을 제공, 추상화 계층에서 사용되는 구현을 구체화한다.

#### 사용 방법

#### 예시 코드