성 패턴 중 3번째 패턴인 팩토리 메서드 패턴이다. 추상 팩토리와 이름이 유사하기 때문에 또 생성

패턴들은 단일체를 제외하고는 대부분 비슷한 형태의 구조를 가지고 있기 때문에 각 패턴들의 차이점을

확실히 이해하면서 넘어가야함!!



[생성패턴]

1. 추상 팩토리(Abstract Factory)

2. 빌더(Abstract Factory)

3. 팩토리 메서드(Factory Method)    _클래스 생성

4. 원형 (Prototype)

5. 단일체(Singleton)



1) 의도

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

  결정은 서브클래스가 내리도록 한다. 이처럼 구체적인 개체를 생성하는 부분을 분리하면 추상 팩토리

  클래스에서는 어떠한 개체를 생성할 것인지에 대한 고민은 뒤로 미루고 개체를 사용하는 부분을 구현할

  수 있다. '팩토리 메서드란 추상 팩토리 클래스에 약속된 개체를 생성하는 메서드이다.' 

  팩토리 메서드는 다른 이름으로 가상 생성자(Virtual Constructor)라 한다.


2) 활용성

  ① 어떤 클래스가 자신이 생성해야 하는 객체의 클래스를 예측할 수 없을 때

  ② 생성할 객체를 기술하는 책임을 자신의 서브클래스가 지정했으면 할 때

  ③ 객체 생성의 책임을 몇 개의 보조 클래스 가운데 하나에게 위임하고, 어떤 서브클래스가

  위임자 인지에 대한 정보를 국소화시키고 싶을 때


3) 구조


  - 클래스 다이어그램  분석

    ① Creator은 Product타입의 객체를 반환하는 팩토리 메서드를 선언. Product 객체의 생성을 위해

    팩토리 메서드를 호출

    ② ConcreteCreator 클래스는 팩토리 메서드를 재정의하여 ConcreteProduct의 인스턴스를  반환


4) 코드


5) 팩토리 메서드를 사용하면서 얻을 수 있는 이익 / 부담

  ① 응용프로그램에 국한된 클래스가 코드에 종속되지 않도록 해준다: 응용 프로그램은

   Product 클래스에 정의된 인터페이스와만 동작하도록 만들어지기 때문에, 사용자가 정의한 어떤

   ConcreteProduct 클래스와도 동작할 수 있게 된다.

  ② 사용자가 ConcreteProduct 객체 하나만 만들려 할 때에도 Creator 클래스를 서브

   클래싱 해야한다: 서브 쿨래싱 기법은 사용자 Creator 클래스를 상속해서 서브 클래스를 만들어야

   할 때에는 훌룡한 방법이지만, 그렇지 않을 때라면 다른 방식으로 클래스의 진화과정을 처리해야

   한다.

  ③ 서브클래스에 대한 훅(hook) 메서드를 제공: 팩토리 메서드로 클래스 내부에서 객체를

   생성하는 것이 객체를 직접 생성하는 것 보다 훨씬 응용성이 높아 진다. 팩토리 메서드 패턴에서는

   객체별로 서로 다른 버전을 제공하는 훅 기능을 서브클래스에 정의


   ※ 훅 메서드란: 추상 클래스 안에 있는 아무일도 하지 않거나 기본적인 행위만 하는 메소드를 

   의미하며 서브클래스에서 오버라이드 할 수 있다. 가상 메서드와는 달리 오버라이드 하지 않아도

   객체를 생성할 수 있다.


  ④ 병렬적인 클래스 계통을 연결하는 역할을 담당: 병렬적 클래스 개통은 클래스가 자신의 

  책임을 분리된 다른 클래스에 위임할때 발생한다. 


댓글을 달아 주세요

  1. 2014.06.17 01:42  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

더 패턴에 대한 다른 예제

1) 디자인 다이어그램



2) 주요 코드 (이번것도 소스코드 분석은 알아서 해보기..)

- 빌더 클래스

     + 추상화 빌더 클래스


     + 구체화된 빌더 클래스: 사실 빌더 패턴을 이해 하는데에는 이 클래스의 내용은 큰 상관이 없다.

     단, '빌더 클래스는 빌더 패턴의 특징에 따라서 구체적인 알고리즘을 표현하는 부분은 

    구현하지 않는 다는 점이 특징이다.'


     + 구체화된 빌더 클래스 두번째


- 디렉터 클래스

     + 디렉터 클래스는 메서드를 통해서 제품을 만들어 낸다. 이때 조건에 따라서 각각 다른

    빌더 클래스를 사용한다. 또 빌더 클래스에서 구현하지 않은 세부적인 알고리즘을 구현한다.

    '이렇게 조건에 따라서 각각 다른 빌더 클래스를 이용, 다른 연산을 수행하고 객체를 

    생성하는 부분과 세부 알고리즘을 분리하는 패턴을 빌더 패턴이라고 한다.'


전체코드:

Builder_tardis.egg


댓글을 달아 주세요



[생성패턴]

1. 추상 팩토리(Abstract Factory)

2. 빌더(Abstract Factory)        _객체 생성

3. 팩토리 메서드(Factory Method)

4. 원형 (Prototype)

5. 단일체(Singleton)



1) 의도

  - 복잡한 객체를 생성하는 방법과 표현하는 방법을 정의하는 클래스를 별도로 분리하여, 서로 다른

표현이라도 이를 생성할 수 있는 동일한 절차를 제공할 수 있도록 한다.


2) 활용성

  ① 복합 객체의 생성 알고리즘이 이를 합성하는 요소 객체들이 무엇인지 이들의 조립 방법에

  독립적일 때 사용한다.

  ② 합성할 객체들의 표현이 서로 다르더라도 생성 절차에서 이를 지원해야 할 때 사용한다.


3) 구조

  - 클래스 다이어그램  내용

    ① Director 클래스가 추상화된 AbstractBuilder 클래스를 참조해 각 Product들을 생성한다.

    ② AbstractBuilder 클래스를 상속받은 ConcreteBuilder들은 필요한 인터페이스들을 재정의해

    각 Product들을 생성 시킨다.


    + 즉 빌더패턴은 각각의 Product 객체들을 생성시키기 각각의 독립적인 절차와 방법을 사용

    하는 패턴을 의미한다.


4) 코드




5) 추상 팩토리를 사용하면서 얻을 수 있는 이익 / 부담

  ① 제품에 대한 내부 표현을 다양하게 변화가능: 빌더 객체는 디렉터를 제공하고제품을 복합하기

  위해 필요한 추상 인터페이스를 정의. 빌더를 사용하면 제품이 어떤 요소에서 복합되는지 표현방법이

  무엇인지 숨길 수 있게 된다. 즉 빌더만이 요소들의 복합과 표현방법에 대해서 알 수 있다.


  ② 생성과 표현에 필요한 코드를 분리: 복합 객체를 생성하고 내부 표현방법을 별도의 모듈로 정의

   가능 사용자는 제품의 내부 구조를 정의한 클래스는 전혀 모른 채, 빌더의 상호 작용을 통해 필요한

   복합 객체를 생성. 

  ③ 복합 객체를 생성하는 절차를 좀더 세밀하게 구분 가능: 한번에 복합객체를 표현하는 것처럼

   빌더 패턴은 디렉터의 통제 아래 하나씩 내부 구성요소들을 만들어 나간다. 디렉터가 빌더에서 만든

   전체 복합 객체를 되돌려 받을 때 까지 제품 복합과정이 계속되기 때문에 빌더 클래스의 인터페이스

   에는 이 제품을 생성하는 과정 자체가 반영되어 있다.

댓글을 달아 주세요