디자인 패턴

: 소프트웨어를 설계할 때 특정 맥락에서 자주 발생하는 고질적인 문제들이 또 발생했을 때 재사용할 할 수있는 훌륭한 해결책

 

1. 전략 패턴 (Strategy Pattern)

: 객체들이 할 수 있는 행위 각각에 대해 전략 클래스를 생성하고, 유사한 행위들을 캡슐화하는 인터페이스를 정의하여 객체의 행위를 동적으로 바꾸고 싶은 경우 직접 행위를 수정하지 않고 전략을 바꿔주기만 함으로써 행위를 유연하게 확장하는 방법.

 

Strategy Pattern Exam

  • Strategy : 인터페이스나 추상 클래스로 외부에서 동일한 방식으로 알고리즘을 호출하는 방법을 명시
  • ConcreteStrategy : "Strategy Pattern"에서 명시한 알고리즘을 실제로 구현한 클래스
  • Context : "Strategy Pattern"을 이용하는 역할을 수행
    필요에 따라 동적으로 구체적인 전략을 바꿀 수 있도록 setter 메서드(‘집약 관계’)를 제공

 

2. 싱글톤 패턴 (Singleton Pattern)

: 전역 변수를 사용하지 않고 객체를 하나만 생성 하도록 하며, 생성된 객체를 어디에서든지 참조할 수 있도록 하는 패턴

 

Singleton Pattern Exam

  • Singleton : 하나의 인스턴스만을 생성하는 책임이 있으며 "getInstance"메서드를 통해 모든 클라이언트에게 동일한 인스턴스를 반환하는 작업을 수행

 

3. 데커레이터 패턴 (Decorator Pattern)

: 객체의 결합 을 통해 기능을 동적으로 유연하게 확장 할 수 있게 해주는 패턴
즉, 기본 기능에 추가할 수 있는 기능의 종류가 많은 경우에 각 추가 기능을 Decorator 클래스로 정의 한 후 필요한 Decorator 객체를 조합함으로써 추가 기능의 조합을 설계 하는 방식

 

Decorator Pattern Exam

  • Component : 기본 기능을 뜻하는 ConcreteComponent와 추가 기능을 뜻하는 Decorator의 공통 기능을 정의
    즉, 클라이언트는 Component를 통해 실제 객체를 사용
  • ConcreteComponent
    기본 기능을 구현하는 클래스
  • Decorator
    많은 수가 존재하는 구체적인 Decorator의 공통 기능을 제공
  • ConcreteDecoratorA, ConcreteDecoratorB
    Decorator의 하위 클래스로 기본 기능에 추가되는 개별적인 기능
    ConcreteDecorator 클래스는 ConcreteComponent 객체에 대한 참조가 필요한데, 이는 Decorator 클래스에서 Component 클래스로의 ‘합성(composition) 관계’를 통해 표현

 

4. 커맨드 패턴 (Command Pattern)

: 실행될 기능을 캡슐화함으로써 주어진 여러 기능을 실행할 수 있는 재사용성이 높은 클래스를 설계하는 패턴
즉, 이벤트가 발생했을 때 실행될 기능이 다양하면서도 변경이 필요한 경우에 이벤트를 발생시키는 클래스를 변경하지 않고 재사용하고자 할 때 유용함

Command Pattern Exam

  • 실행될 기능을 캡슐화함으로써 기능의 실행을 요구하는 호출자(Invoker) 클래스와 실제 기능을 실행하는 수신자(Receiver) 클래스 사이의 의존성을 제거한다. 따라서 실행될 기능의 변경에도 호출자 클래스를 수정 없이 그대로 사용 할 수 있도록 해줌.
  • Command
    실행될 기능에 대한 인터페이스. 실행될 기능을 execute 메서드로 선언함
  • ConcreteCommand
    실제로 실행되는 기능을 구현. 즉, Command라는 인터페이스를 구현함
  • Invoker
    기능의 실행을 요청하는 호출자 클래스
  • Receiver
    ConcreteCommand에서 execute 메서드를 구현할 때 필요한 클래스. 즉, ConcreteCommand의 기능을 실행하기 위해 사용하는 수신자 클래스

 

5. 템플릿 메서드 패턴 (Template Method Pattern)

: 어떤 작업을 처리하는 일부분을 서브 클래스로 캡슐화해 전체 일을 수행하는 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내역을 바꾸는 패턴

 

: 전체적으로는 동일하면서 부분적으로는 다른 구문으로 구성된 메서드의 코드 중복을 최소화 할 때 유용하다.
다른 관점에서 보면 동일한 기능을 상위 클래스에서 정의하면서 확장/변화가 필요한 부분만 서브 클래스에서 구현할 수 있도록 함

 

Template Method Pattern Exam

  • AbstractClass
    템플릿 메서드를 정의하는 클래스
    하위 클래스에 공통 알고리즘을 정의하고 하위 클래스에서 구현될 기능을 primitive 메서드 또는 hook 메서드로 정의하는 클래스
  • ConcreteClass
    물려받은 primitive 메서드 또는 hook 메서드를 구현하는 클래스
    상위 클래스에 구현된 템플릿 메서드의 일반적인 알고리즘에서 하위 클래스에 적합하게 primitive 메서드나 hook 메서드를 오버라이드하는 클래스

 

6. 팩토리 메서드 패턴 (Factory Method Pattern)

: 객체 생성 처리를 서브 클래스로 분리 해 처리하도록 캡슐화하는 패턴
즉, 객체의 생성 코드를 별도의 클래스/메서드로 분리함으로써 객체 생성의 변화에 대비하는 데 유용하다.


:특정 기능의 구현은 개별 클래스를 통해 제공되는 것이 바람직한 설계이나, 기능의 변경이나 상황에 따른 기능의 선택은 해당 객체를 생성하는 코드의 변경을 초래한다.
상황에 따라 적절한 객체를 생성하는 코드는 자주 중복될 수 있으므로 객체 생성 방식의 변화는 해당되는 모든 코드 부분을 변경해야 하는 문제가 발생함.

 

Factory Method Pattern Exam

  • Product :팩토리 메서드로 생성될 객체의 공통 인터페이스
  • ConcreteProduct : 구체적으로 객체가 생성되는 클래스
  • Creator : 팩토리 메서드를 갖는 클래스
  • ConcreteCreator : 팩토리 메서드를 구현하는 클래스로 ConcreteProduct 객체를 생성

※ Factory Method Pattern의 개념과 적용

  1. 객체 생성을 전담하는 별도의 Factory class 이용
    : Strategy Pattern + Singleton Pattern 을 이용함
  2. 상속 이용
    : Strategy Pattern + Singleton Pattern + Template Method Pattern 을 이용함

 

7. 추상팩토리 패턴 (Abstract Factory Pattern)

: 구체적인 클래스에 의존하지 않고 서로 연관되거나 의존적인 객체들의 조합을 만드는 인터페이스를 제공하는 패턴

: Singleton Pattern + Factory Method Pattern 을 사용

 

Abstract Factory Pattern Exam

  • AbstractFactory
    실제 팩토리 클래스의 공통 인터페이스
  • ConcreteFactory
    구체적인 팩토리 클래스로 AbstractFactory 클래스의 추상 메서드를 오버라이드함으로써 구체적인 제품을 생성
  • AbstractProduct
    제품의 공통 인터페이스
  • ConcreteProduct
    구체적인 팩토리 클래스에서 생성되는 구체적인 제품
수토리지