GOF 디자인 패턴

김민재·2023년 11월 12일
0

디자인 패턴

목록 보기
1/1

디자인 패턴에는 GoF(Gang of Four)의 23가지 디자인 패턴이 존재한다.

그 중 생성 패턴 / 구조 패턴 / 행위 패턴을 정리해보았다.

Creational Patterns (생성 패턴)

: 객체 생성에 사용되는 패턴이다.
주요 목적은 객체의 생성 방식을 다양화하고, 시스템에 적절한 객체를 생성하기 위한 방법을 제공하는 것이다.

1. Abstract Factory (추상 팩토리)

: 서로 관련있는 여러 객체를 만들어주는 인터페이스를 제공하는 패턴이다. 동일한 주제의 다른 팩토리를 묶어준다.
즉, 관련성 있는 여러 종류의 객체를 일관된 방식으로 생성하는 경우 사용된다.

추상팩토리 패턴을 사용하면 구체적으로 어떤 클래스의 인스턴스를 사용하는지 클라이언트에게 감출 수 있습니다.

2. Singleton (단일체)

: 특정 클래스의 인스턴스가 하나만 생성되도록 하는 패턴이다.
한 클래스에 한 객체만 존재하도록 제한하는 것이다.
예를 들어 컴퓨터 자체를 표현하거나 현재 시스템 설정을 표현할 때 사용되는 클래스이다.

생성자를 private 으로 선언하고, 생성자를 클래스 내부에서만 호출하도록 한다.

3. Builder

: 객체를 생성하는 클래스와 표현하는 클래스를 분리하여, 서로 다른 표현을 생성하는 방법이다.

객체의 생성 알고리즘이 조립 방법에 독립적인 경우에 사용된다.

아래 그림에서 추상 클래스인 ToyBuilder에서 Director가 요청하는 build 연산을 정의한다.
ToyBuilder를 상속받은 ConcreteBuilder(PoohBuilder, ZzangGuBuilder)가 필요한 표현을 override한다. ConcreteBuilder는 Toy의 부품들을 조립하고 Director는 조립이 완성된 Toy를 반환한다.

4. Prototype(원형)

: 기존 객체를 복제하여 객체를 생성하는 것이다.
이러한 방식을 통해 객체 생성에 드는 코딩 분량을 현저하게 줄일 수 있다.

아래 그림에서 Prototype 인스턴스를 등록해 놓고 , 등록된 인스턴스를 복사해서 또 다른 인스턴스를 생성하는 과정을 보인다. (재사용성 good)

Structural Patterns (구조 패턴)

: 이 패턴들은 클래스나 객체들을 더 큰 구조로 조직하는 데 관련된다. 다양한 객체 간의 관계를 정의하고 구성하는 방법을 제공한다.

1. Adapter (어댑터)

: 서로 다른 인터페이스를 가진 두 객체를 연결한다.
객체 생성을 하위 클래스로 분리하여 유연성을 제공하는 방식이다.

예를 들어 다른 곳에서 개발한 클래스이고, 그 클래스를 우리가 마음대로 수정할 수 없는 경우이다.
이러한 경우에 우리의 코드에 맞게 중간에 변환할 수 있는 클래스가 Adapter이다.

아래 그림에서 Adapter 클래스로부터 Adaptee 클래스가 구체적인 Request() 메소드를 상속받아 처리하고 있는 것을 알 수 있다. 따라서 타 클래스의 인터페이스를 기존 인터페이스에 덧붙일 수 있는 것이다.

2. Bridge (가교)

: 추상화와 구현을 분리해 둘을 각각 따로 발전시키는 방식이다.

따라서 독립적으로 변형이 가능하고 확장이 가능하도록 한다.

아래 그림에서 Abstraction 은 기능 계층의 최상위 클래스이다.
기능 계층에서 새로운 부분을 확장하는 RefindAbstaction 클래스가 존재한다.
Implementor : 기능 계층을 구현하기 위한 인터페이스
ConcreteImplementor : 실제 기능을 구현하는 클래스이다.

3. Composite (복합체)

: 여러 객체들을 묶어서 하나의 객체로 사용하는 것이다.

아래 그림에서 Component 객체는 Leaf 와 Composite 객체를 합쳐서 만들어진 것이다. 따라서 Component 객체는 두 객체의 메서드를 모두 가지고있는 것을 알 수 있다.

4. Decorator (데코레이터)

: 기존의 객체의 메서드에 동적으로 새로운 기능을 추가할 수 있도록 하거나 오버라이딩 하는 것이다.

5. Flyweight (플라이 급)

: 다수의 유사한 객체를 생성하고 조작하는 비용을 절감할 수 있는 방식이다.

변화하지 않는 재사용 가능한 커다란 객체를 캐시에 저장해두고 재활용하는 기법이다.
성능 향상에 주된 목적인 기법이다.

6. Facade (창구)

: 많은 분량의 코드에 접근 가능하도록 단순한 인터페이스를 제공하는 것이다.
따라서 높은 레벨의 인터페이스를 제공한다.

아래 그림은 여러 클래스들의 기능을 묶은 Facade 클래스에 접근하는 Client 를 표현한다.

7. Proxy (대리인)

: 접근을 조절, 비용 절감, 복잡도 감소를 위해서 접근이 힘든 객체에 대한 대역을 제공한다.
시간이 많이 걸리는 작업을 할 때, 프록시가 할 수 있는 일은 프록시가 하고 할 수 없는 일(Heavy job)은 본래의 클래스에게 넘겨준다.

아래 그림은 Proxy 클래스에 우선 일을 위임하고, 그 뒤에 RealSubject가 해야할 일은 넘겨주는 방법이다.

Behavioral Patterns (행위 패턴)

: 이러한 패턴들은 객체들 사이의 알고리즘 및 역할 분배에 초점을 둔다.
객체 간의 통신 및 책임 분산을 조정하는 방법을 제공한다.

  • Chain of Responsibility (책임 연쇄) : 책임들이 연결되어 있어 내가 책임을 못 질 것 같은 것은 다음 책임자에게 자동으로 넘어가는 구조이다.

  • Command (명령) : 명령어들을 각각 구현하는 것보다 하나의 추상클래스에 메서드를 하나 만든 후 각 명령이 들어오면 그에 맞는 서브 클래스가 선택되어 실행하는 것이다.

  • Iterator (반복자) : 반복이 필요한 자료구조를 모두 동일한 인터페이스를 통해 접근가능 하도록 메소드를 이용하여 자료구조를 활용할 수 있게 해주는 것이다.

  • Observer (감시자): 한 객체의 상태 변화를 다른 객체에 통지하는 방법을 정의한다.

  • Strategy (전략): 동일한 목표를 달성하기 위해 여러 알고리즘을 정의하고 적용할 수 있는 방법을 제공한다.

  • Memento (메멘토) : undo 기능을 개발할 때 유용한 디자인패턴, 클래스 설계 관점에서 객체의 정보를 저장하는 것을 말한다.

  • Mediator (중재자) : 클래스간에 복잡한 상호작용을 캡슐화하여 한 클래스에서 위임해서 처리하는 디자인 패턴을 말한다.

  • State (상태) : 동일한 동작을 객체의 상태에 따라 다르게 처리해야 하는 경우 사용되는 패턴을 말한다.

  • Visitor (방문자) : 각 클래스의 데이터 구조로부터 처리 기능을 분리하여 별도의 클래스로 만들어 놓고, 해당 클래스의 메서드가 각 클래스를 돌아다니며 특정 작업을 수행하도록 하는 것을 말한다.

이러한 패턴들은 소프트웨어 디자인의 일반적인 문제를 해결하기 위한 유용한 방법을 제공하고, 시스템을 유연하고 확장 가능하게 만들어준다.

디자인 패턴별 다이어그램들


출처 : mcdonaldland 블로그

profile
아아아아아아

0개의 댓글