팩토리 패턴이란

 

  • 객체 생성 처리를 서브 클래스로 분리해 처리하도록 캡슐화하는 패턴
    • 즉, 객체의 생성 코드를 별도의 클래스 / 매소드로 분리함으로써 객체 생성의 변화에 대비하는데 유용하다.
    • 특정 기능의 구현은 개별 클래스를 통해 제공되는 것이 바람직한 설계다.
      • 기능의 변경이나 상황에 따른 기능의 선택은 해당 객체를 생성하는 코드의 변경을 초래한다.
      • 상황에 따라 적절한 객체를 생성하는 코드는 자주 중복될 수 있다.
      • 객체 생성 방식의 변화는 해당되는 모든 코드 부분을 변경해야 하는 문제가 발생한다.
  • 역할이 수행하는 작업
    • Product
      • 팩토리 메소드로 생성될 객체의 공통 인터페이스
    • ConcreteProduct
      • 구체적으로 객체가 생성되는 클래스
    • Creator
      • 팩토리 메소드를 갖는 클래스
    • ConcreteCreator
      • 팩토리 메소드를 구현하는 클래스로 ConcreteProduct 객체를 생성
  • 팩토리 메소드 패턴의 개념과 적용 방법
    • 객체 생성을 전담하는 별도의 Factory 클래스 이용
      • 스트래티지 패턴과 싱글턴 패턴을 이용한다.
    • 상속 이용 : 하위 클래스에서 적합한 클래스의 객체를 생성
      • 스트래티지 패턴, 싱글턴 패턴과 템플릿 메소드 패턴을 이용한다.

 

예시

 

여러 가지 방식의 엘리베이터 스케줄링 방법 지원하기

 

  • 작업 처리량을 기준으로 한 스케줄링에 따른 엘리베이터 관리
  • 스케줄링 : 주어진 요청(목적지 층과 방향)을 받았을 때 여러 대의 엘리베이터 중 하나를 선택하는 것을 말한다.
    • 예를 들어 엘리베이터 내부에서 버튼을 눌렀을 때는 해당 사용자가 탄 엘리베이터를 이동시킨다.
    • 그러나 사용자가 엘리베이터 외부, 즉 건물 내부의 층에서 버튼을 누른 경우에는 여러 대의 엘리베이터 중 하나를 선택해 이동시켜야 한다.

 

문제점1

 

  • 다른 스케줄링 전략을 사용하는 경우
    • 엘리베이터 작업 처리량을 최대화시키는 전략이 아닌 사용자의 대기 시간을 최소화하는 엘리베이터 선택 전략을 사용해야 한다면?
  • 프로그램 실행 중에 스케줄링 전략을 변경, 즉 동적 스케줄링을 지원 해야하는 경우
    • 오전에는 대기 시간 최소화 전략을 사용하고, 오후에는 처리량 최대화 전략을 사용해야 한다면?

 

문제점 2

 

  • 엘리베이터 스케줄링 전략이 추가되거나 동적 스케줄링 방식으로 전략을 선택하도록 변경되면
    • 해당 스케줄링 전략을 지원하는 구체적인 클래스를 생성 해야한다.
    • 즉, 엘리베이터를 선택하는 전략의 변경에 따라 함수가 변경되는 것은 바람직하지 않다.
  • 예를 들어
    • 새로운 스케줄링 전략이 추가되는 경우
      • 엘리베이터 노후화 최소화 전략
    • 동적 스케줄링 방식이 변경되는 경우
      • 오전 : 대기 시간 최소화 전략, 오후 : 처리량 최대화 전략 -> 두 전략의 사용 기간을 서로 바꾸는 경우

 

 

해결책

 

과정1

 

주어진 기능을 실제로 제공하는 적절한 클래스 생성 작업을 별도의 클래스 / 메소드로 분리시켜야 한다.

 

과정 2

 

동적 스케줄링 방식이라고 하면 여러 번 스케줄링 객체를 생성하지 않고 한 번 생성한 것을 계속해서 사용하는 것이 바람직 할 수 있다.

'프로그래밍 > 디자인 패턴' 카테고리의 다른 글

싱글턴 패턴 (Singleton Pattern)  (0) 2020.02.17
디자인 패턴의 종류  (0) 2020.02.17
디자인 패턴의 개념과 구조  (0) 2020.02.17