디자인 패턴 정리

디자인 패턴

  • 소프트웨어를 개발 할 때 특정 맥락에서 자주 발생하는 고질적인 문제들에
    재사용 할 수 있는 훌륭한 해결책
  • 패턴?
    • 각기 다른 소프트웨어 모듈에는 서로 공통되는 설계 문제가 존재하며
      이를 처리하는 해결책도 공통점이 있다. 이러한 유사점을 패턴이라 한다

디자인 패턴 종류

  • GoF(Gang of Four) 디자인 패턴

    • 에리히 감마(Erich Gamma), 리차드 헬름(Richard Helm), 랄프 존슨(Ralph Johnson), 존 블리시디스(John Vissides)

    http://blog.naver.com/PostView.nhn?blogId=2feelus&logNo=220642212134&redirect=Dlog&widgetTypeCall=true

  • 생성 패턴

    • 객체 생성에 관련된 패턴
    • 객체의 생성과 조합을 캡슐화해 특정 객체가 생성되거나 변경되어도
      프로그램 구조에 영향을 크게 받지 않도록 유연성을 제공한다.
      • 추상 팩토리 패턴
        • 서로 연관되거나 의존적인 객체들을 합쳐서 하나의 객체로 만들 수 있게 해주는 패턴
      • 빌더 패턴
      • 팩토리 메서드 패턴
      • 싱글톤 패턴
        • 생성된 객체를 어디에서든지 참조할 수 있도록 하는 패턴
  • 구조 패턴
    • 클래스나 객체를 조합해 더 큰 구조를 만드는 패턴
      • 어댑터 패턴
      • 브리지 패턴
      • 컴포지트 패턴
      • 데코레이터 패턴
      • 파사드 패턴
      • 프록시 패턴
      • 플라이웨이트 패턴
  • 행위패턴
    • 객체나 클래스 사이의 알고리즘이나 책임 분배에 관련된 패턴
    • 한 객체가 혼자 수행할 수 없는 작업을 여러개의 객체로 어떻게 분배하는지,
      객체 사이의 결합도를 어떻게 최소화하는지
      • 책임 연쇄 패턴
      • 반복자 패턴
      • 중재자 패턴
      • 전략 패턴
      • 커맨드 패턴
      • 방문자 패턴
      • 인터프리터 패턴
      • 메멘토 패턴
      • 옵저버 패턴
      • 상태 패턴
      • 템플릿 메소드 패턴
      • 널 오브젝트 패턴
  • 동시성 패턴
    • 반응자 패턴(Reactor Pattern)

디자인 패턴 상세

  1. 빌더 패턴

객체를 생성할때 흔하게 사용하는 패턴이다.
자바로 코딩할 때 다음과 같은 스타일로 객체를 생성하는 코드가 있다면, 빌더 패턴을 사용했다고 할 수 있다.

1
2
3
4
Member customer = Member.build()
.name("홍길동")
.age(30)
.build();

자바에서는 다음과 같이 매개변수를 받아 객체를 생성할 수 있다. (빌더패턴 미적용)

  • 점층적 생성자 패턴
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    class Car {
    private int a;
    private int b;
    private int c;
    private int d;

    public Car(int a, int b) {
    this(a, b, 0);
    }

    public Car(int a, int b, int c) {
    this(a, b, c, 0);
    }

    public Car(int a, int b, int c, int d) {
    this.a = a;
    this.b = b;
    this.c = c;
    this.d = d;
    }
    }

다만 이렇게 적용하면 너무 가독성이 떨어지므로 다음과 같이 패턴화한다.

  • 빌더 패턴
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    public class Car {
    private int a;
    private int b;
    private int c;
    private int d;

    public static class Builder {
    private int a = 0;
    private int b = 0;
    private int c = 0;
    private int d = 0;

    public Builder() { }

    public Builder setA(int v) {
    a = v;
    return this;
    }

    public Builder setB(int v) {
    b = v;
    return this;
    }

    public Builder setC(int v) {
    c = v;
    return this;
    }

    public Builder setD(int v) {
    d = v;
    return this;
    }
    public Car build() {
    return new Car(this);
    }
    }

    // Car 객체로 return 하기위한 Car 생성자를 생성함
    private Car(Builder builder) {
    a = builder.a;
    b = builder.b;
    c = builder.c;
    d = builder.d;
    }
    }
1
2
3
4
5
6
Car car = new Car.Builder()
.setA(1)
.setB(2)
.setC(1)
.setD(2)
.build();

코틀린에선 클래스를 정의하면서 사용할 수 있는
data class가 있으므로 굳이 빌더패턴을 만들 필요가 없다.

  1. 팩토리 패턴

클래스의 인스턴스를 생성할때 바로 new 를 써서 생성하지 않고 new Instance() 를 써서 만든다.

  • 팩토리 메소드 패턴
    • 객체를 생성하기 위한 인터페이스를 정의할때, 어떤 클래스의 인터페이스를 만들지는 서브 클래스에서 결정한다.
  • 추상 팩토리 패턴
    • 인터페이스를 이용하여 서로 연관된, 또는 의존하는 객체를 구상 클래스를 지정하지 않고도 생성할 수 있다.
    • 추상 팩토리 패턴에는 팩토리 메소드 패턴이 포함될 수 있다.
  • 추상화된 것에 의존하도록 만들어라. 구상 클래스에 의존하지 않도록 만든다 에 기안한 패턴이다.
  • 필요한 것
    1. 객체를 만들기위한 interface (없어도 됨)
    2. 위의 interface 를 기반으로 한 객체 클래스
    3. 객체 클래스를 선택하기 위한 팩토리 클래스 (서브클래스)
    4. 메인 클래스 (서브클래스를 이용해 객체클래스를 선택하기위함)
  1. 반응자패턴 (reactor pattern)

이벤트 핸들 패턴의 전형적인 모습이다.

  • 이벤트 핸들링을 위한 객체들을 초기화(Initiate)하고,
  • 여러 통로에서 들어오는 이벤트들을 수신(Receive)하고,
  • 이벤트들을 대응할 객체별로 분할 (Demultiplex)하고,
  • 객체에게 이벤트를 발송(dispatch)해서,
  • 그 객체가 이벤트에 걸맞는 작업을 수행(process events) 한다.
공유하기