GoF (Gang of Four) 디자인 패턴

DanChu 🌟·2022년 7월 12일
0

객체지향적 프로그래밍이 활발해지면서 재사용 관점에서 상호간의 커뮤니케이션이 더욱 중요해짐. 이에따라 잠재적 문제가 될 수 있는 위험을 최소화 하고자 프로토콜(규약)이 만들어진 것 같다고 함.
GoF에서는 23가지 디자인 패턴을 3가지 유형으로 분류

1. 생성 (creational) 패턴

- 객체를 생성하는데 관련된 패턴들
- 클라이언트와 그 클라이언트가 생성해야 하는 객체 인스턴스 사이의 연결을 끊어 주는 패턴
- 객체가 생성되는 과정의 유연성을 높이고 손쉬운 코드의 유지

싱글턴 (singleton)

  • 특정 클래스에 객체 인스턴스가 하나만 만들어지도록 하는 패턴
  • 전역 변수를 사용할 때처럼 객체 인스턴스를 어디서든지 엑세스할 수 있게 만들기 가능
  • 클래스 인스턴스를 하나만 만들고 그 인스턴스로 전역 접근 제공

추상 팩토리 abstract factory

  • 구상 클래스에 의존하지 않고도 서로 연관되거나 의존적인 객체로 이루어진 제품군을 생산하는 인터페이스를 제공
  • 구상 클래스는 서브 클래스에서 생성

팩토리 메소드 factory method

  • 객체를 생성할 때 필요한 인터페이스를 만듦
  • 어떤 클래스를 만들지는 서브 클래스에서 결정
  • 팩토리 메소드 패턴을 사용하면 클래스 인스턴스 만드는 일을 서브 클래스에게 맡기게 됨

2. 구조 (structural) 패턴

- 프로그램 구조에 관련된 패턴들
- 프로그램 내의 자료구조 또는 인터페이스 구조 등 프로그램의 구조를 설계하는데 활용 가능한 패턴들
- 클래스나 객체를 조합해 더 큰 구조를 만드는 패턴

데코레이터 decorator

  • 객체에 추가 요소를 동적으로 더할 수 있게 해줌
  • 서브 크래스 만들 때보다 훨씬 유연하게 기능 확장 가능

프록시 proxy

  • 특정 객체로 접근을 제어하는 대리인 (특정 객체를 대변하는 객체)를 제공

컴포지트 composite

  • 객체를 트리구조로 구성해서 부분-전체 계층구조 구현
  • 클라이언트에서 개별 객체와 복합 객체를 똑같은 방법으로 다룰 수 있게 해줌

어댑터 adapter

  • 특정 클래스 인터페이스를 클라이언트에서 요구하는 다른 인터페이스로 변환
  • 인터페이스가 호환되지 않아 같이 쓸 수 없었던 클래스를 사용할 수 있게 도와줌

퍼사드 facade

  • 서브 시스템에 있는 일련의 인터페이스를 통합 인터페이스로 묶어줌
  • 고수준 인터페이스도 정의 -> 서브 시스템을 더 편리하게 사용 가능

3. 행위 (behavioral) 패턴

- 반복적으로 사용되는 객체들의 상호작용을 패턴화한 것들
- 결합도를 최소화하는 것에 중점
- 인스턴스(클래스) 사이에 알고리즘이나 책임 분배에 관련한 패턴

템플릿 메소드 template method

  • 알고리즘 골격을 정의
  • 알고리즘 일부 단계를 서브클래스에서 구현 할 수 있음
  • 알고리즘 구조는 그대로 유지하면서 알고리즘의 특정 단계를 서브 클래스에서 재정의 할 수 있음

싱글턴 (singleton)

  • 특정 클래스에 객체 인스턴스가 하나만 만들어지도록 하는 패턴
  • 전역 변수를 사용할 때처럼 객체 인스턴스를 어디서든지 엑세스할 수 있게 만들기 가능
  • 클래스 인스턴스를 하나만 만들고 그 인스턴스로 전역 접근 제공

상태 state

  • 객체 내부 상태가 바뀜에 따라 객체의 행동을 바꿀 수 있게 해줌
    -> 마치 객체의 클래스가 바뀌는 것과 같은 결과

반복자 iterator

  • 컬렉션의 구현 방법을 노출하지 않으면서 집합체 내의 모든 항목에 접근하는 방법 제공

전략 strategy

  • 알고리즘군을 정의하고 캡슐화해서 각각의 알고리즘군을 수정해서 쓸 수 있게 해줌
  • 클라이언트로부터 알고리즘을 분리해서 독립적으로 변경할 수 있음

옵저버 observer

  • 한 객체이 상태가 바뀌면 그 객체에 의존하는 다른 객체에 연락이 가고 자동으로 내용이 갱신되는 방식으로, 일대다 의존성 정의

출처:
https://m.hanbit.co.kr/channel/category/category_view.html?cms_code=CMS8616098823

0개의 댓글