이전

GOF 디자인패턴

GoF(GoF: Gang of Four) 디자인 패턴은 1994년에 출판된 책 “Design Patterns: Elements of Reusable Object-Oriented Software”에서 소개된 23가지 디자인 패턴을 말합니다. 이 책은 에리히 감마(Erich Gamma), 리처드 헬름(Richard Helm), 랄프 존슨(Ralph Johnson), 존 블리시데스(John Vlissides)라는 네 명의 저자에 의해 작성되었습니다. 이 디자인 패턴들은 소프트웨어 설계에서 반복적으로 나타나는 문제를 해결하기 위해 고안되었습니다.

이 패턴들은 세 가지 주요 범주로 나뉩니다:

  1. 생성 패턴 (Creational Patterns)
  2. 구조 패턴 (Structural Patterns)
  3. 행동 패턴 (Behavioral Patterns)

1. 생성 패턴 (Creational Patterns)

객체 생성 메커니즘을 다루며 객체 생성의 유연성과 재사용성을 높입니다.

  • 추상 팩토리 (Abstract Factory): 관련된 객체들의 가족을 생성하기 위한 인터페이스를 제공합니다.
  • 빌더 (Builder): 복합 객체의 생성 과정을 객체로 캡슐화하여 객체의 생성 과정을 분리합니다.
  • 팩토리 메서드 (Factory Method): 객체 생성을 위한 인터페이스를 제공하며, 실제 생성은 서브클래스에서 수행합니다.
  • 프로토타입 (Prototype): 기존 객체를 복제하여 새로운 객체를 생성합니다.
  • 싱글턴 (Singleton): 클래스의 인스턴스가 하나만 존재하도록 보장합니다.

2. 구조 패턴 (Structural Patterns)

클래스나 객체를 조합하여 더 큰 구조를 만드는 방법을 다룹니다.

  • 어댑터 (Adapter): 호환되지 않는 인터페이스를 가진 클래스를 함께 동작하도록 합니다.
  • 브리지 (Bridge): 구현과 추상을 분리하여 독립적으로 변형할 수 있도록 합니다.
  • 컴포지트 (Composite): 객체를 트리 구조로 구성하여 부분-전체 계층 구조를 구현합니다.
  • 데코레이터 (Decorator): 객체에 동적으로 새로운 책임을 추가할 수 있게 합니다.
  • 퍼사드 (Facade): 서브시스템에 대한 간단한 인터페이스를 제공합니다.
  • 플라이웨이트 (Flyweight): 공유를 통해 다수의 객체를 효율적으로 지원합니다.
  • 프록시 (Proxy): 다른 객체에 대한 접근을 제어하는 대리자 객체를 제공합니다.

3. 행동 패턴 (Behavioral Patterns)

객체 간의 책임 분배와 소통 방법을 다룹니다.

  • 책임 연쇄 (Chain of Responsibility): 요청을 처리할 수 있는 기회를 객체 사슬에 따라 순차적으로 제공합니다.
  • 커맨드 (Command): 요청을 객체로 캡슐화하여 요청자와 수행자를 분리합니다.
  • 인터프리터 (Interpreter): 언어의 문법을 클래스로 표현하여 해석합니다.
  • 반복자 (Iterator): 집합체 요소에 순차적으로 접근할 수 있는 방법을 제공합니다.
  • 중재자 (Mediator): 객체 간의 상호작용을 캡슐화하여 객체 간의 결합도를 줄입니다.
  • 메멘토 (Memento): 객체의 상태를 캡슐화하여 나중에 복원할 수 있게 합니다.
  • 옵저버 (Observer): 객체의 상태 변화에 따라 다른 객체에 알림을 전달합니다.
  • 상태 (State): 객체의 상태에 따라 행위를 변경합니다.
  • 전략 (Strategy): 동일한 문제를 해결하는 다양한 알고리즘을 캡슐화하여 상호 교체할 수 있게 합니다.
  • 템플릿 메서드 (Template Method): 상위 클래스에서 알고리즘의 골격을 정의하고 하위 클래스에서 세부 사항을 구현합니다.
  • 방문자 (Visitor): 객체 구조를 변경하지 않고 새로운 기능을 추가합니다.

각 패턴은 특정 문제를 해결하기 위한 일반적인 방법을 제공하며, 이를 통해 소프트웨어 설계의 유연성과 유지보수성을 높일 수 있습니다. 디자인 패턴을 이해하고 적절히 사용하는 것은 소프트웨어 개발자에게 매우 중요한 기술입니다.