Study/Computer Science

[디자인 패턴] GoF(Gang of Fours) 디자인 패턴 종류와 특징

욘아리 2024. 7. 24. 15:02

정처기 실기 시험을 위해 디자인 패턴의 종류와 특징을 정리해두려고 한다. (시험용 암기..ㅎㅎ)

 

생성 패턴

객체 생성과 관련한 패턴

 

1. Abstract Factory(추상 팩토리)

  • 서로 관련된 객체들의 패밀리를 생성하기 위해 인터페이스를 제공한다.
  • 구체적인 클래스를 명시하지 않고도 객체들을 생성할 수 있다.
  • 클라이언트는 생성된 객체를 인터페이스를 통해 사용한다.

2. Builder(빌더)

  • 복잡한 객체의 생성 과정여러 단계로 나누어 처리한다.
  • 최종적으로 다양한 표현을 갖는 객체를 생성할 수 있도록 한다.
  • 객체의 생성이 복잡할 때 사용되며, 코드의 유지보수성과 확장성을 향상시키는 데 유용하다.

3. Factory Method(팩토리 메서드)

  • 객체 생성을 처리하는 인터페이스를 제공하고, 실제 객체의 생성은 서브클래스가 결정하도록 위임한다.
  • 객체 생성에 대한 의존성을 줄이고, 확장성과 유연성을 향상시킬 수 있다.
  • 객체를 생성하는 처리를 파생 클래스로 분리하여 처리하도록 캡슐화한다.
  • Virtual-Contructor 패턴이라고도 한다.

4. Prototype(프로토타입)

  • 기존 객체를 복제함으로써 새로운 객체를 생성한다.
  • prototype을 먼저 생성하고 인스턴스를 복제하여 사용하는 구조이다.

5. Singleton(싱글톤)

  • 객체의 인스턴스가 오직 하나만 생성되도록 보장한다.
  • 전역적으로 접근 가능한 단일 인스턴스를 제공한다.

 

구조 패턴

객체를 조합해서 더 큰 구조를 만드는 패턴

 

1. Adapter(어댑터)

  • 호환되지 않는 인터페이스를 가진 클래스들이 함께 작동할 수 있도록 한다.
  • 클라이언트에서 요구하는 다른 인터페이스로 변환한다.
  • 한 클래스의 인터페이스를 클라이언트에서 필요로 하는 인터페이스로 변환해준다.
  • 두 인터페이스 간의 호환성 문제를 해결하여, 코드 변경없이 기존 클래스를 사용할 수 있다.

2. Bridge(브릿지)

  • 추상화와 구현을 분리하여 두 계층이 독립적으로 변화할 수 있게 한다.
  • 두 개의 클래스 계층을 분리해 두면 각각의 클래스 계층을 독립적으로 확장할 수 있다.

3. Composite(컴포지트)

  • 객체를 트리 구조로 구성하여 개별 객체와 객체의 조합을 클라이언트에서 동일하게 처리할 수 있도록 한다.

4. Decorator(데코레이터)

  • 객체에 동적으로 새로운 기능을 추가한다.
  • 코드의 수정 없이 객체의 기능을 확장할 수 있는 방법을 제공한다.
  • 상속을 사용하지 않고도 객체의 기능을 동적으로 확장할 수 있도록 해준다.

5. Facade(퍼사드)

  • 복잡한 시스템을 단순화한다.
  • 클라이언트는 단일 인터페이스만 사용하고 내부 구현은 숨긴다.
  • 서브시스템 사이의 의사소통 및 종속성을 최소화하기 위하여 단순화된 하나의 인터페이스를 제공한다.

6. Flyweight(플라이웨이트)

  • 객체를 공유하여 메모리를 절약한다.
  • 객체 생성 시간이 오래 걸리는 경우, 또는 객체가 많이 생성될 가능성이 있는 경우에 사용된다.

7. Proxy(프록시)

  • 다른 객체에 대한 접근 제어/중개하는 디자인 패턴이다.
  • 특정 객체의 대리자나 대변인 역할을 하는 프록시 객체를 제공한다.


행위 패턴

알고리즘이나 책임 분배에 관련된 패턴

 

1. Chain of Responsibility(책임 연쇄)

  • 요청을 처리하는 객체들을 체인 형태로 연결하여 요청을 순서대로 전달한다.
  • 각 객체는 요청을 처리할 수 있는지 판단하고, 처리할 수 없으면 다음 객체에 전달한다.

2. Command(커맨드)

  • 요청을 객체로 캡슐화하여 요청자와 처리자를 분리한다.
  • 명령, 요청자, 클라이언트, 수신자로 구분된다.

3. Interpreter(인터프리터)

  • 문법 규칙을 기반으로 문장을 해석한다.
  • 프로그래밍 언어의 문법을 해석하는 데 사용된다.

4. Iterator(반복자)

  • 컬렉션의 요소들을 순차적으로 접근하고 처리할 수 있도록 한다.
  • 집합 객체의 요소들에 대해 순서대로 접근하는 방법을 제공한다.
  • 배열, 배열리스트, 해시 테이블과 같은 객체를 처리하는 데 사용하는 패턴이다.
  • 서로 다른 집합 객체 구조에 대해 동일한 방법으로 순회할 수 있다.

5. Mediator(중재자)

  • 여러 객체 간의 상호 작용을 중앙 집중식으로 관리한다.
  • 객체 간의 통제와 지시의 역할을 하는 중재자를 두어 객체지향의 목표를 달성한다.
  • 여러 객체들이 서로 메시지를 주고받는 상호 작용을 특정 객체 안에 캡슐화하여 서로의 존재를 모르는 상태에서도 메시지를 주고받으며 협력할 수 있도록 한다.

6. Memento(메멘토)

  • 객체의 이전 상태를 저장하고 복원할 수 있도록 한다.

7. Observer(옵저버)

  • 객체의 상태 변화를 관찰하고 싶은 다른 객체들에게 자동으로 알린다.
  • 일대다의 객체 의존 관계를 정의하며, 한 객체의 상태가 변화되었을 때, 의존 관계에 있는 다른 객체들에게 자동적으로 변화를 통지한다.

8. State(상태)

  • 객체의 내부 상태에 따라 객체의 동작을 변경한다.
  • 객체의 상태에 따라 객체의 행위 내용을 변경해주는 패턴이다.

9. Strategy(전략)

  • 알고리즘을 객체로 캡슐화하고, 알고리즘을 선택하고 실행하는 방법을 제공한다.
  • GPS 신호를 수신하는 경우와 수신하지 못하는 경우에 따라 차량의 위치를 구하는 다른 알고리즘을 선택하고자 할 때 가장 적합하다.

10. Template Method(템플릿 메서드)

  • 알고리즘의 핵심적인 골격은 그대로 유지하면서, 일부 단계는 하위 클래스에서 구체적으로 구현한다.

11. Visitor(방문자)

  • 객체 구조를 변경하지 않고 객체에 새로운 연산을 추가한다.



 

출처

흥달쌤 디자인패턴 강의