Gof Design Pattern - 다양한 패턴

HeadFirst Design Pattern을 읽고

Posted by Yan on July 30, 2022

🌉 브리지 패턴 Bridge Pattern

브리지 패턴: 구현과 추상화 부분까지 변경하고자 할 때 사용

브리지 패턴

🌉 브리지 패턴의 장점

  • 구현과 인터페이스를 완전히 결합하지 않았기 때문에 구현과 추상화 부분을 분리할 수 있다.
  • 추상화된 부분과 실제 구현 부분을 독립적으로 확장할 수 있다.
  • 추상화 부분을 구현한 구상 클래스가 바뀌어도 클라이언트에는 영향을 끼치지 않는다.

🌉 브리지 패턴의 단점

  • 디자인이 복잡해진다.

🌉 브리지 패턴의 활용법

  • 여러 플랫폼에서 사용해야 하는 그래픽스와 윈도우 처리 시스템
  • 인터페이스와 실제 구현할 부분을 서로 다른 방식으로 변경해야 할 때

🏗 빌더 패턴 Builder Pattern

빌더 패턴: 제품을 여러 단계로 나눠서 만들도록 제품 생산 단계를 캡슐화하고 싶을 때 사용

빌더 패턴

🏗 빌더 패턴의 장점

  • 복합 객체 생성 과정을 캡슐화한다.
  • 여러 단계와 다양한 절차를 거쳐 객체를 만들 수 있다.
  • 제품의 내부 구조를 클라이언트로부터 보호할 수 있다.
  • 클라이언트는 추상 인터페이스만 볼 수 있기에 제품을 구현한 코들르 쉽게 바꿀 수 있다.

🏗 빌더 패턴의 단점

  • 복합 객체 구조를 구축하는 용도로 많이 쓰인다.
  • 팩토리를 사용할 때보다 객체를 만들 때 클라이언트에 관해 더 많이 알아야 한다.

⛓ 책임 연쇄 패턴 Chain of Responsibility Pattern

책임 연쇄 패턴: 1개의 요청을 2개 이상의 객체에서 처리해야 할 때 사용 책임 연쇄 패턴

⛓ 책임 연쇄 패턴의 장점

  • 요청을 보낸 쪽과 받는 쪽을 분리할 수 있다.
  • 객체는 사슬의 구조를 몰라도 되고, 그 사슬에 들어있는 다른 객체의 직접적인 레퍼런스를 가질 필요도 없으므로 객체를 단순하게 만들 수 있다.
  • 사슬에 들어가는 객체를 바꾸거나 순서를 바꿈으로써 역할을 동적으로 추가하거나 제거할 수 있다.

⛓ 책임 연쇄 패턴의 활용법

  • 윈도우 시스템에서 마우스 클릭과 키보드 이벤트를 처리할 때

⛓ 책임 연쇄 패턴의 단점

  • 요청이 반드시 수행된다는 보장이 없다. 사슬 끝까지 갔는데도 처리되지 않을 수 있다. (이는 장점이 될 수도 있다.)
  • 실행 시에 과정을 살펴보거나 디버깅하기 힘들다.

🥊 플라이웨이트 패턴 Flyweight Pattern

플라이웨이트 패턴: 인스턴스 하나로 여러 개의 가상 인스턴스를 제공하고 싶을 때 사용

플라이웨이트 패턴

🥊 플라이웨이트 패턴의 장점

  • 실행 시에 객체 인스턴스의 개수를 줄여서 메모리를 절약할 수 있다.
  • 여러 가상객체의 상태를 한 곳에 모아 둘 수 있다.

🥊 플라이웨이트 패턴의 활용법

  • 어떤 클래스의 인스턴스가 아주 많이 필요하지만 모두 똑같은 방식으로 제어해야할 때

🥊 플라이웨이트 패턴의 단점

  • 특정 인스턴스만 다른 인스턴스와 다르게 행동할 수 없다.

🌎 인터프리터 패턴 Interpreter Pattern

인터프리터 패턴: 어떤 언어의 인터프리터를 만들 때

인터프리터 패턴

🌎 인터프리터 패턴의 장점

  • 문법을 클래스로 표현해서 쉽게 언어를 구현할 수 있다.
  • 문법이 클래스로 표현되므로 언어를 쉽게 변경하거나 확장할 수 있다.
  • 클래스 구조에 메소드만 추가하면 프로그램을 해석하는 기본 기능 외에 예쁘게 출력하는 기능이나 더 나은 프로그램 확인 기능 같은 새로운 기능을 추가할 수 있다.

🌎 인터프리터 패턴의 단점

  • 문법 규칙의 개수가 많아지면 아주 복잡해진다. 그럴 땐 파서나 컴파일러 생성기를 쓰는 것이 낫다.

🌎 인터프리터 패턴의 활용

  • 간단한 언어를 구현할 때
  • 효율보다는 단순하고 간단하게 문법을 만드는 것이 더 중요할 때
  • 스크립트 언어와 프로그래밍 언어에서 모두 쓸 수 있다.

🔔 중재자 패턴 Mediator Pattern

중재자 패턴: 서로 관련된 객체 사이의 복잡한 통신과 제어를 한곳으로 집중하고 싶을 때

  • 상태가 바뀔 때마다 중재자에게 알려준다.
  • 중재자에서 보낸 요청에 응답한다.

중재자 패턴

🔔 중재자 패턴의 장점

  • 시스템과 객체를 분리함으로써 재사용성을 획기적으로 향상시킬 수 있다.
  • 제어 로직을 한 군데 모아놨으므로 관리하기가 수월하다.
  • 시스템에 들어있는 객체 사이에서 오가는 메시지를 확 줄이고 단순화할 수 있다.

🔔 중재자 패턴의 단점

  • 디자인을 잘 하지 못하면 중재자 객체가 너무 복잡해질 수 있다.

🔔 중재자 패턴의 활용

  • 서로 연관된 GUI 구성 요소를 관리할 때

📷 메멘토 패턴 Memento Pattern

메멘토 패턴: 객체를 이전의 상태로 복구해야 할 때

  • 시스템에서 핵심적인 기능을 담당하는 객체의 상태를 저장하기 위함이다.
  • 핵심적인 객체의 캡슐화를 유지하기 위함이다.

메멘토 패턴

📷 메멘토 패턴의 장점

  • 저장된 상태를 핵심 객체와는 다른 별도의 객체에 보관할 수 있어 안전하다.
  • 핵심 객체의 데이터를 계속해서 캡슐화된 상태로 유지할 수 있다.
  • 복구 기능을 구현하기가 쉽다.

📷 메멘토 패턴의 단점

  • 상태를 저장하고 복구하는 데 시간이 오래 걸릴 수 있다.

📷 메멘토 패턴의 활용

  • 메멘토 객체를 써서 상태를 저장한다.
  • 자바 시스템에서는 시스템의 상태를 저장할 때 직렬화를 이용하는 것이 좋다.

🖨 프로토타입 패턴 Prototype Pattern

프로토타입 패턴: 어떤 클래스의 인스턴스를 만들 때 자원과 시간이 많이 들거나 복잡할 때

프로토타입 패턴

🖨 프로토타입 패턴의 장점

  • 클라이언트는 새로운 인스턴스를 만드는 과정을 몰라도 된다.
  • 클라이언트는 구체적인 형식을 몰라도 객체를 생성할 수 있다.
  • 상황에 따라서는 객체를 새로 생성하는 것보다 객체를 복사하는 것이 더 효율적일 수 있다.

🖨 프로토타입 패턴의 단점

  • 때때로 객체의 복사본을 만드는 일이 매우 복잡할 수도 있다.

🖨 프로토타입 패턴의 활용

  • 시스템에서 복잡한 클래스 계층구조에 파묻혀 잇는 다양한 형식의 객체 인스턴스를 새로 만들어야 할 때

🙋🏼 비지터 패턴 Visitor Pattern

비지터 패턴: 다양한 객체에 새로운 기능을 추가해야 하는데 캡슐화가 별로 중요하지 않을 때

  • 비지터 객체는 Traverser 객체와 함께 돌아간다.
  • Traverser: 비지터 객체에서 복합 객체 내의 모든 객체를 대상으로 원하는 작업을 처리하게 해주는 것
  • 새로운 기능이 필요하면 비지터만 고치면 된다.

비지터 패턴

🙋🏼 비지터 패턴의 장점

  • 구조를 변경하지 않으면서도 복합 객체 구조에 새로운 기능을 추가할 수 있다.
  • 비교적 손쉽게 새로운 기능을 추가할 수 있다.
  • 비지터가 수행하는 기능과 관련된 코드를 한곳에 모아 둘 수 있다.

    🙋🏼 비지터 패턴의 단점

  • 비지터를 사용하면 복합 클래스의 캡슐화가 깨진다.
  • 컬렉션 내의 모든 항목에 접근하는 트래버서가 있으므로 복합 구조를 변경하기가 더 어려워진다.
reference

HeadFirst Design Pattern