[디자인 패턴] 디자인 패턴 정리

이멀젼씨

·

2021. 5. 1. 10:34

목적

좀 더 나은 코드를 위해 어떤 패턴을 써야 유용할 지 한눈에 보고 판단하기 위함

목차

  1. 디자인 패턴이란?
  2. 생성패턴
  3. 구조패턴
  4. 행위패턴
  5. 디자인 패턴 비교

1. 디자인 패턴이란?


프로그램 설계 시 자주 발생하는 문제들을 해결 할 수 있는 프로그램 설계 방법


생성패턴 : 객체의 생성과 관련된 패턴
구조패턴 : 객체를 조합하여 더 큰 구조를 만드는 패턴
행위패턴 : 객체 사이의 알고리즘이나 책임 분배에 관련된 패턴


2. 생성패턴


  • 프로토타입


    기존에 생성된 객체를 복제해서 새로운 객체를 생성하는 패턴
    기본은 얕은복사
    Cloneable의 clone메소드를 오버라이딩하여 사용

  • 팩토리 메서드


    객체의 생성을 서브클래스로 분리하여 처리하는 패턴
    팩토리 클래스를 만들어 클라이언트의 요구에 따른 객체를 반환

  • 추상 팩토리


    연관된 클래스들을 한꺼번에 생성하도록 만드는 패턴
    관련성 있는 여러 종류의 객체를 일관된 방식으로 생성하는 경우에 유용

  • 싱글톤


    전역변수를 사용하지 않고 객체를 하나만 생성하여, 어디서든지 참조할 수 있도록 하는 패턴
    LazyHolder을 사용하는 싱글톤 패턴이 가장 이상적

  • 빌더


    객체의 생성과정과 표현방법을 분리하여 동일한 생성 절차에서 서로 다른 표현결과를 만들 수 있게 하는 패턴
    점층적 생성자 패턴과 자바 빈 패턴 결합

3. 구조패턴


  • 플라이웨이트


    동일하거나 유사한 객체들 사이에 가능한 많은 데이터를 공유하여 메모리 사용을 최소화 하는 패턴
    생성되는 객체의 수가 많거나, 생성된 객체가 오래도록 메모리에 상주 등에 적합
    Integer.valueOf 메서드도 플라이웨이트 패턴을 사용하여 -128~127사이의 값은 캐싱하여 같은 참조값을 갖도록 만듦

  • 프록시


    실제 기능을 수행하는 객체대신 가상의 객체를 사용해 로직의 흐름을 제어하는 패턴
    가상의 객체의 내부 코드가 실제 객체의 수행을 감싸고 있는 형태

  • 퍼사드


    일련의 서브 시스템의 인터페이스에 대한 통합된 인터페이스를 제공하여 서브 시스템 사용을 더 쉽게 할 수 있도록 하는 패턴

  • 컴포지트


    여러개의 객체들로 구성된 복합객체와 단일객체를 클라이언트에서 구별없이 다루게 해주는 패턴
    파일 디렉토리와 같은 관계를 갖는 객체들 사이에 유용
    클라이언트는 전체와 부분을 구별하지 않고 동일한 인터페이스 사용 가능

  • 어댑터


    어느 클래스의 인터페이스를 다른 클래스에서 사용하고자 할 때 다른 클래스에서 사용할 수 있도록 호환성을 제공하는 패턴
    클래스 어댑터는 다중상속이 안되고 실행 중간에 변경할 수 도 없으므로, 객체 어댑터 사용이 나음

  • 브리지


    구현으로부터 기능을 분리하여 각자 독립적으로 변형할 수 있게 하는 패턴

  • 데코레이터


    객체의 결합을 통해 기능을 동적으로 유연하게 확장 할 수 있게 해주는 패턴
    기본 기능에 추가할 수 있는 기능의 종류가 많은 경우, 각 추가 기능을 Decorator클래스로 정의하고 필요한 Decorator객체를 조합하여 사용

4. 행위패턴


  • 템플릿 메서드


    어떤 작업을 처리하는 일부분을 서브 클래스로 캡슐화하여 전체 일을 수행하는 구조는 바뀌지 않으면서, 특정 단계에서 수행하는 내역을 바꾸는 패턴
    메인로직은 추상클래스의 일반메서드로 정의, 구현마다 달라질 기능은 구현 클래스에서 선언 후 호출하는 방식으로 사용

  • 커맨드


    객체의 행위를 클래스로 만들어 캡슐화하는 패턴
    기능이 수정되거나 확장될 때 기존 코드의 수정 없이 기능에 대한 클래스를 적용하면 되므로 시스템 확장성이 있으면서 유연해짐

  • 책임연쇄


    요청을 처리하는 동일 인터페이스 객체들을 체인 형태로 연결해놓은 패턴
    앞의 객체가 요청을 처리하지 못할 경우, 같은 인터페이스의 다른 객체에게 해당 요청을 전달
    자바의 exception처리가 대표적

  • 중재자


    모든 클래스간의 복잡한 로직을 캡슐화하여 하나의 클래스에 위임하여 처리하는 패턴
    M:N의 관계에서 M:1의 관계로 복잡도를 떨어뜨려 유지보수 및 재사용의 확장에 유리

  • 전략


    행위를 클래스로 캡슐화하여 동적으로 행위를 자유롭게 바꿀 수 있게 해주는 패턴
    전략을 쉽게 변경할 수 있음

  • 옵저버


    어떤 객체의 상태가 변하거나 이벤트가 발생했을 때 그와 연관된 객체들에 알림을 보내는 패턴

  • 상태


    상태를 클래스로 만들어 어떤 행위를 수행할 때 상태에 행위를 수행하도록 위임하는 패턴
    시스템의 각 상태를 클래스로 분리하여 표현

  • 방문자


    데이터 구조와 기능을 분리하여 구조를 변경하지 않고 새로운 기능을 추가할 수 있는 패턴
    새로운 연산 추가 시 방문자만 추가하면 됨

  • 메멘토


    객체의 상태 정보를 저장하고, 필요에 의해 원하는 시점의 데이터를 복원할 수 있는 패턴

5. 디자인 패턴 비교


  • 옵저버 vs 중재자


    옵저버 : 한 개의 Publisher가 여러개의 Subscriber에게 알림을 줄 때 사용(M:1)
    중재자 : 여러개의 Publisher가 서로 상호작용 할 때 사용(M:N), 한 Publisher는 곧 Subscriber가 될 수 있음

  • 퍼사드 vs 템플릿 메서드


    퍼사드 : 서브시스템의 기능은 정의가 되어있고, 일련의 기능들을 통합된 인터페이스로 제공
    템플릿 메서드 : 서브시스템을 수행할 수 있는 통합된 인터페이스를 제공하나, 서브시스템에 대한 기능은 정의가 되어있지 않고 구현에 따라 다르게 사용가능.

  • 커맨드 vs 전략


    커맨드 : 행위가 변경될 때 사용(내부에 상태를 갖고 있음)
    전략 : 알고리즘이 변경될 때 사용