# 2024.07.12 객체지향 디자인 패턴

# 디자인 패턴

## 개념

* 소프트웨어 공학의 소프트웨어 설계에서 공통으로 발생하는 문제에 대해 자주 쓰이는 설계 방법을 정리한 패턴
    
* 디자인 패턴을 참고하여 개발할 경우 개발의 효율성과 유지보수성, 운용성 등의 품질이 높아지며, 프로그램의 최적화에 도움이 된다.
    

## 디자인 패턴 구성요소

* 이름, 문제 및 배경, 솔루션, 사례, 결과, 샘플 코드로 구성되어 있다.
    

## 디자인 패턴 유형

| 유형 | 설명 |
| --- | --- |
| 생성 | 객체 인스턴스 생성에 관여, 클래스 정의와 객체 생성 방식을 구조화, 캡슐화를 수행하는 패턴 |
| 구조 | 더 큰 구조 형성 목적으로 클래스나 객체의 조합을 다루는 패턴 |
| 행위 | 클래스나 객체들이 상호 작용하는 방법과 역할 분담을 다루는 패턴 |

## 디자인 패턴 종류

### 생성 패턴

| 패턴 | 설명 |
| --- | --- |
| builder | 복잡한 인스턴스를 조립하여 만드는 구조 |
| 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있는 디자인 패턴 |  |
| 생성과 표기를 분리해서 복잡한 객체를 생성 |  |
| Prototype | 처음부터 일반적인 원형을 만들어 놓고, 그것을 복사한 후 필요한 부분만 수정하여 사용하는 패턴, 객체의 원형을 제공하는 인스턴스에서 생성할 객체들의 타입이 결정되도록 설정하며 객체를 생성할 때 갖추어야 할 기본 형태가 있을 때 사용되는 디자인 패턴 |
| 기존 객체를 복제함으로써 객체를 생성 |  |
| Factory Method | 상위 클래스에서 객체를 생성하는 인터페이스를 정의하고, 하위 클래스에서 인스턴스를 생성하도록 하는 방식, 인터페이스와 실제 객체를 생성하는 클래스를 분리할 수 있는 특성을 갖는 디자인 패턴, 생성할 객체의 클래스를 국한하지 않고 객체를 생성 |
| Abstract Factory | 구체적인 클래스에 의존하지 않고 서로 연관되거나 의존적인 객체들의 조합을 만드는 인터페이스를 제공하는 패턴, 사용자에게 인터페이스를 제공하고, 구체적인 구현은 Concrete Product 클래스에서 이루어지는 특징을 갖는다, 동일한 주제의 다른 팩토리를 묶음 |
| Singleton | 전역 변수를 사용하지 않고 객체를 하나만 생성하도록 하며, 생성된 객체를 어디에서든지 참조할 수 있도록 하는 디자인 패턴, 한 클래스에 한 객체만 존재하도록 제한 |

### 구조 패턴

| 패턴 | 설명 |
| --- | --- |
| Bridge | 구현뿐 아니라 추상화된 부분까지 변경해야 하는 경우 활용, 기능의 클래스 계층과 구현의 클래스 계층을 연결하고, 구현부에서 추상 계층을 분리하여 추상화된 부분과 실제 구현 부분을 독립적으로 확장할 수 있는 디자인 패턴 |
| Decorator | 기존에 구성되어 있는 클래스에 필요한 기능을 추가해 나가는 설계 패턴, 상속의 대안으로 사용한다, 객체의 결합을 통해 기능을 동적으로 유연하게 확장 가능 |
| Facade | 복잡한 시스템에 대하여 단순한 인터페이스를 제공함, 사용자와 시스템 간 여타 시스템과의 결합도를 낮추어 시스템 구조에 대한 파악을 쉽게 하는 패턴, 오류에 대해서 단위별 확인 가능, 접근성을 높일 수 있음, 통합된 인터페이스 제공 |
| Flyweight | 클래스의 경량화를 목적으로 하는 디자인 패턴 , 여러 개의 가상 인스턴스를 제공하여 메모리 절감 |
| Proxy | 실제 객체에 대한 대리 객체로 실제 객체에 대한 접근 이전에 필요한 행동을 취할 수 있게 만들며, 이 점을 이용해서 미리 할당하지 않아도 상관없는 것들을 실제 이용할 때 할당하게 하여 메모리 용량을 아낄 수 있다, 실제 객체를 드러나지 않게 하여 정보 은닉의 역할도 수행하는 디자인 패턴&lt;br&gt; 특정 객체로의 접근을 제어하기 위한 용도로 사용 |
|  |  |
| Composite | 객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 하는 패턴&lt;br&gt; 복잡 객체와 단일 객체를 동일하게 취급 |
|  |  |
| Adapter | 기존에 생성된 클래스를 재사용할 수 있도록 중간에서 맞춰주는 역할을 하는 인터페이스를 만드는 패턴, 상속을 이용하는 클래스 패턴과 위임을 이용하는 인스턴스 패턴의 두 가지 형태로 사용되는 디자인 패턴&lt;br&gt; 인터페이스가 호환되지 않는 클래스들을 함꼐 이용할 수 있도록 타 클래스의 인터페이스를 기존 인터페이스에 덧씌움 |
|  |  |

## 디자인 패턴의 장단점

### 장점:

* 요구사항 변경에 따른 소스 코드 변경을 최소화할 수 있게 해줌
    
* 소프트웨어 코드의 품질을 향상시킬 수 있음
    
* 설계 변경 요청에 대한 유연한 대처가 가능
    
* 범용적인 코딩 스타일 적용 가능
    
* 개발자 간의 원할한 의사소통 가능
    
* 재사용을 통한 개발 시간 단축 가능
    
* 소프트웨어 구조 파악이 용이
    
* 객체 지향 설계 및 구현의 생산성을 높이는 데 적합
    
* 소프트웨어의 품질과 생산성을 향상시킬 수 있음
    

### 단점:

* 객체 지향 설계/구현 위주로 사용
    
* 초기 투자 비용의 부담
