본문 바로가기

디자인패턴

디자인 패턴 23가지

디자인패턴이란?

소프트웨어를 개발하다 보면 특정한 상황에서 특정한 문제가 반복적으로 발생하곤 합니다. 디자인 패턴은 이렇게 반복적으로 발생하는 문제들을 해결하기 위해 만들어진 패턴입니다.

 

디자인패턴의 종류

디자인 패턴 23가지는 크게 생성(Creational), 구조(Structural), 행위(Behavioral) 3가지로 분류할 수 있습니다.

생성 구조 행위
  팩토리 메소드 (Factory Method)
  추상 팩토리 (Abstract Factory)
  빌더 (Builder)
  프로토타입 (Prototype)
  싱글톤 (Singleton)
  어댑터 (Adapter)
  브릿지 (Bridge)
  컴퍼지트 (Composite)
  데코레이터 (Decorator)
  파사드 (Facade)
  플라이웨이트 (Flyweight)
  프록시 (Proxy)
  책임 연쇄 (Chain of Responsibility)
  커맨드 (Command)
  인터프리터 (Interpreter)
  이터레이터 (Iterator)
  미디에이터 (Mediator)
  메멘토 (Memento)
  옵저버 (Observer)
  스테이트 (State)
  스트래티지 (Strategy)
  템플릿 메소드 (Template Method)
  비지터 (Visitor)

1. 생성

  • 객채의 생성과 관련된 패턴
  • 객체의 생성과 조합을 캡슐화하여 특정 객체가 생성되거나 변경되어도 프로그램에 영향을 끼치지 않음

2. 구조

  • 클래스나 객체를 조합하여 더 구조를 만드는 패턴
  • 여러 인터페이스를 묶어 하나의 인터페이스로 제공하거나 여러 객체들을 묶어 새로운 객체를 제공

3. 행위

  • 객체 사이의 로직이나 객체가 담당하는 책임에 관련된 패턴
  • 예를들어, 한 객체가 담당하던 로직을 여러 객체가 담당하도록 분리

각각의 패턴 요약

생성 패턴

1. 팩토리 메소드 (Factory Method)

 - 객체 생성을 서브 클래스에게 위임하는 패턴

 - 객체를 생성하기 위해 인터페이스를 정의하고, 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 서브클래스가 결정


2. 추상 팩토리 (Abstract Factory)

 - 구체적인 클래스에 의존하지 않도록 인터페이스를 제공하는 패턴

 - 상세화된 서브클래스를 정의하지 않고도 서로 관련성이 있거나 독립적인 여러 객체의 집단을 생성하기 위한 인터페이스를 제공

 

3. 빌더 (Builder)

 - 객체를 생성할 때, 필드를 점층적으로 입력하여 객체를 생성하는 패턴


4. 프로토타입 (Prototype)

 - 프로로타입은 원본의 인스턴스로 새로운 인스턴스를 만드는 패턴. 즉, 원본 객체에 의해 새롭게 생성될 객체의 타입이 결정되는 패턴


5. 싱글톤 (Singleton)

 - 객체의 인스턴스를 오직 1개만 생성하고, 다른 클라이언트들은 동일한 인스턴스를 참조하여 작업을 수행하는 패턴

 

구조 패턴

6. 어댑터 (Adapter)

 - 특정 인터페이스를 클라이언트가 사용하는 다른 인터페이스로 변환

 - 어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결

 

7. 브릿지 (Bridge)

 - 구현부에서 추상층을 분리하여 각자 독립적으로 변형할 수 있게 하는 패턴


8. 컴퍼지트 (Composite)

 - 단일 객체와 여러 개의 단일 객체로 이루어진 복합 객체를 클라이언트에서 구분 없이 사용하게 해주는 패턴


9. 데코레이터 (Decorator)

 - 객체의 결합을 통해 기능을 동적으로 유연하게 확장할 수 있게 해주는 패턴


10. 파사드 (Facade)

 - 서브시스템에 있는 인터페이스 집합에 대해서 하나의 통합된 인터페이스를 제공하는 패턴으로, 서브시스템을 좀더 사용하기 편하게 만드는 상위 수준의 인터페이스를 정의

11. 플라이웨이트 (Flyweight)

 - 크기가 작은객체가 여러개 있을 때, 공유를 통해 이들을 효율적으로 지원하는 패턴


12. 프록시 (Proxy)

 - 어떤 다른 객체로 접근하는 것을 통제하기 위해서 그 객체의 대리자 또는 자리채움자를 제공하는 패턴

 

행위 패턴

13. 책임 연쇄 (Chain of Responsibility)

 - 요청을 처리할 수 있는 기회를 하나 이상의 객체에게 부여하여 요청을 보내는 객체와 그 요청을 받는 객체 사이의 결합을 피하는 패턴

 - 요청을 받을 수 있는 객체를 연쇄적으로 묶고, 실제 요청을 처리할 객체를 만날 때까지 객체 고리를 따라서 요청을 전달


14. 커맨드 (Command)

 - 실행할 기능을 캡슐화 함으로써 여러 기능이 재사용될 수 있도록 클래스를 설계하는 패턴


15. 인터프리터 (Interpreter)

 - 주어진 언어에 대해, 그 언어의 문법을 위한 표현 수단을 정의하고, 이와 아울러 그 표현 수단을 사용하여 해당 언어로 작성된 문장을 해석하는 해석기를 정의하는 패턴


16. 이터레이터 (Iterator)

 - 내부 표현부를 노출하지 않고 어떤 객체 집합에 속한 원소들을 순차적으로 접근할 수 있는 방법을 제공하는 패턴


17. 미디에이터 (Mediator)

 - 한 집합에 속해있는 객체들의 상호작용을 캡슐화하는 객체를 정의하는 패턴

 - 객체들이 직접 서로를 참조하지 않도록 함으로써 객체들 사이의 결합도를 낮추며, 개발자가 객체들의 상호작용을 독립적으로 다양화시킬 수 있도록 하는 패턴


18. 메멘토 (Memento)

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


19. 옵저버 (Observer)

 - 객체 사이에 일 대 다의 의존 관계를 정의해 두어, 한 객체의 상태 변화에 따라 다른 객체들이 그 변화를 통지받고 자동으로 갱신될 수 있게 만드는 패턴


20. 스테이트 (State)

 - 객체의 내부 상태에 따라 스스로 행동을 변경할 수 있게끔 허가하는 패턴으로, 이렇게 하면 객체는 마치 자신의 클래스를 바꾸는 것 처럼 보임


21. 스트래티지 (Strategy)

 - 동일 계열의 알고리즘군을 정의하고, 각각의 알고리즘을 캡슐화하며, 이들을 상호교환이 가능하도록 만드는 패턴


22. 템플릿 메소드 (Template Method)

 - 작업을 처리하는 일부분을 서브 클래스에게 위임하여 전체 수행 구조는 바꾸지 않으면서 특정 단계의 수행 구조만 바꾸는 패턴

 - 객체의 연산에는 알고리즘의 뼈대만을 정의하고 각 단계에서 수행할 구체적 처리는 서브클래스 쪽으로 미루는 패턴


23. 비지터 (Visitor)

 - 객체 구조를 이루는 원소에 대해 수행할 연산을 표현하는 패턴으로, 연산을 적용할 원소의 클래스를 변경하지 않고도 새로운 연산을 정의할 수 있게 함

 


디자인 원칙

  • 애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분으로부터 분리시킨다.
  • Concrete가 아닌 인터페이스에 맞춰서 프로그래밍 한다.
  • 상속보다는 Composition을 활용한다.
  • 서로 상호작용 하는 객체 사이에서는 가능한 느슨하게 결합하는 디자인을 사용해야 한다.
  • 클래스는 확장에 대해서는 열려 있어야 하지만 코드 변경에 대해서는 닫혀 있어야 한다.
  • 최소 지식 원칙
    • 정말 친한 친구하고만 이야기하라.
    • 시스템을 디자인할 때, 어떤 객체든 그 객체와 상호작용을 하는 클래스의 개수에 주의해야 하며, 그런 객체들과 어떤 식으로 상호작용 하는지도 신경써야 한다는 뜻
    • 친구는 만들지 않으면서 다른 객체에 영향력을 행사하는 방법은 어떤 메소드에서든지 다음 네 종류 객체의 메소드만을 호출하면 된다.
      1. 객체 자체 
      2. 메소드에 매개 변수로 전달된 객체
      3. 그 메소드에서 생성하거나 인스턴스를 만든 객체
      4. 그 객체에 속하는 구성요소

 

디자인 패턴 23가지의 간단한 요약은 여기서 마무리 하구요.

각각의 구조나 동작 방식 등에 대해서는 디자인 패턴 별로 각각 포스팅 해볼게요~

 

 

참고

Head First Design Patterns / 에릭 프리먼 등 저 / 서환수 역 / 한빛미디어
http://https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=cra2yboy&logNo=220001640887
http://http://https://gmlwjd9405.github.io/2018/07/06/design-pattern.html
http://https://velog.io/@undefined/gof-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4

 

'디자인패턴' 카테고리의 다른 글

Decorator Pattern  (0) 2021.08.07
Observer Pattern  (0) 2021.08.07