복잡한 대상의 조립과 창설-건설자 모델(셋째):Director의 토론, 모델 총결

11209 단어 작성자 모드

8.4 Director에 대한 추가 논의


지휘자 클래스 Director는 건설자 모델에서 매우 중요한 역할을 한다. 간단한 Director 클래스는 구체적인 건설자가 제품을 어떻게 구축하는지 지도하는 데 사용된다. 이것은 일정한 순서에 따라 Builder의buildPartX() 방법을 호출하고 호출의 선후 순서를 제어하며 클라이언트에게 완전한 제품 대상을 되돌려준다.다음은 몇 가지 Director의 고급 응용 방법에 대해 살펴보겠습니다.
1. Director 생략
일부 경우 시스템 구조를 단순화하기 위해 Director와 추상 작성자 Builder를 통합하고 Builder에서 복잡한 제품 객체를 단계적으로 구축하는 construct() 방법을 제공할 수 있습니다.Builder 클래스는 일반적으로 추상 클래스이기 때문에 construct () 방법을 정적 (static) 방법으로 정의할 수 있습니다.게임 역할 설계에서 지휘자 클래스인 ActorController를 생략하면 ActorBuilder 클래스의 코드는 다음과 같이 수정됩니다.
abstract class ActorBuilder
{
       protected static Actor actor = new  Actor();

       public  abstract void buildType();
       public  abstract void buildSex();
       public  abstract void buildFace();
       public  abstract void buildCostume();
       public  abstract void buildHairstyle();

       public static Actor  construct(ActorBuilder ab)
       {
              ab.buildType();
              ab.buildSex();
              ab.buildFace();
              ab.buildCostume();
              ab.buildHairstyle();
              return actor;
       }
}

해당 클라이언트 코드도 다음과 같이 코드 세그먼트가 수정됩니다.
 ……
 ActorBuilder  ab;
 ab  = (ActorBuilder)XMLUtil.getBean();

 Actor  actor;
 actor =  ActorBuilder.construct(ab);
 ……

이외에도 construct () 방법의 매개 변수를 제거하고 construct () 방법에서buildPartX () 방법을 직접 호출할 수 있는 더 간단한 처리 방법이 있습니다. 코드는 다음과 같습니다.
abstract class ActorBuilder
{
       protected  Actor actor = new Actor();

       public  abstract void buildType();
       public  abstract void buildSex();
       public  abstract void buildFace();
       public  abstract void buildCostume();
       public  abstract void buildHairstyle();

       public Actor construct()
       {
              this.buildType();
              this.buildSex();
              this.buildFace();
              this.buildCostume();
              this.buildHairstyle();
              return actor;
       }
}

클라이언트 코드 세그먼트는 다음과 같습니다.
……
ActorBuilder  ab;
ab  = (ActorBuilder)XMLUtil.getBean();

Actor  actor;
actor = ab.construct();
……

이 때 construct () 방법은 다른buildPartX () 방법이 호출되는 순서를 정의하고 다른 방법의 실행에 프로세스 템플릿을 제공합니다. 이것은 우리가 다음에 배울 템플릿 방법 모델과 매우 유사합니다.
상기 두 가지 디렉터 클래스에 대한 생략 방식은 모두 시스템의 유연성과 확장성에 영향을 주지 않고 시스템 구조를 간소화했지만 추상적인 건설자 클래스의 직책을 가중시켰다. 만약에 construct() 방법이 비교적 복잡하고 구축해야 할 제품의 구성 부분이 많으면 construct() 방법을 디렉터에 단독으로 봉인하는 것이'단일 직책 원칙'에 더욱 부합된다.
2. 갈고리 방법의 도입
건설자 모델은 점차적으로 복잡한 제품 대상을 구축하는 것 외에 Director 클래스를 통해 제품의 창설 과정을 더욱 세밀하게 제어할 수 있다. 예를 들어 갈고리 방법(Hook Method)이라고 불리는 특수한 방법을 추가하여 어떤build PartX()에 대한 사용 여부를 제어할 수 있다.
갈고리 방법의 반환 유형은 보통boolean 유형이고 방법 이름은 isXXX()이며 갈고리 방법은 추상적인 건설자 클래스에 정의됩니다.예를 들어 우리는 게임 캐릭터의 추상적인 건설자 클래스인 Actor Builder에서 어떤 캐릭터가'머리 대머리(Bareheaded)'인지 판단하는 방법인 isBareheaded()를 정의할 수 있다. ActorBuilder에서 기본적인 실현을 제공하는데 그 반환값은false이고 코드는 다음과 같다.
abstract class ActorBuilder
{
       protected  Actor actor = new Actor();

       public  abstract void buildType();
       public  abstract void buildSex();
       public  abstract void buildFace();
       public  abstract void buildCostume();
       public  abstract void buildHairstyle();

       // 
public boolean isBareheaded()
       {
              return false;
       }

       public  Actor createActor()
       {
              return  actor;
       }
}

캐릭터가'악마(Devil)'와 같은 머리카락 위젯을 구축할 필요가 없다면 해당 구체적인 건조기인 DevilBuilder는 isBareheaded() 방법을 덮어쓰고 반환값을true로 바꿉니다. 코드는 다음과 같습니다.
class DevilBuilder extends ActorBuilder {
       public  void buildType()
       {
              actor.setType(" ");
       }
       public  void buildSex()
       {
              actor.setSex(" ");
       }
       public  void buildFace()
       {
              actor.setFace(" ");
       }
       public  void buildCostume()
       {
              actor.setCostume(" ");
       }
       public  void buildHairstyle()
       {
              actor.setHairstyle(" ");
       }
     // 
       public boolean isBareheaded()
       {
              return true;
       }     
}

이때 지휘자 클래스 ActorController의 코드는 다음과 같이 수정됩니다.
class ActorController { public Actor construct(ActorBuilder ab) { Actor actor; ab.buildType(); ab.buildSex(); ab.buildFace(); ab.buildCostume(); //  if(!ab.isBareheaded()) { ab. buildHairstyle(); } actor=ab.createActor(); return actor; } }

클라이언트 코드에서 구체적인 건설자 유형을 지정하고 지휘자를 통해 제품의 점차적인 구축을 실현할 때 갈고리 방법인 isBareheaded()를 호출하여 게임 캐릭터에 머리카락이 있는지 판단한다. 만약에 isBareheaded() 방법이true, 즉 머리카락이 없으면 헤어스타일을 구축하는 방법인buildHairstyle()를 건너뛴다.그렇지 않으면 buildHairstyle () 방법을 실행합니다.갈고리 방법을 도입함으로써 우리는 Director에서 복잡한 제품의 구축을 세밀하게 제어할 수 있다.buildPartX() 방법의 실행 순서를 지정할 뿐만 아니라 어떤buildPartX() 방법을 실행해야 하는지도 제어할 수 있다.

8.5 건설자 모델 요약


건설자 모델의 핵심은 여러 개의 구성 부품을 포함하는 완전한 대상을 어떻게 한 걸음 한 걸음 구축하고 같은 구축 과정을 이용하여 서로 다른 제품을 구축하는가이다. 소프트웨어 개발에서 만약에 우리가 복잡한 대상을 만들고 시스템이 좋은 유연성과 확장성을 갖추기를 원한다면 건설자 모델을 사용하는 것을 고려할 수 있다.
1. 주요 장점
(1) 건설자 모델에서 클라이언트는 제품 내부 구성의 세부 사항을 알지 않고 제품 자체와 제품의 창설 과정을 결합시켜 같은 창설 과정이 서로 다른 제품 대상을 창설할 수 있도록 한다.
(2) 모든 구체적인 건축자는 상대적으로 독립되고 다른 구체적인 건축자와 무관하기 때문에 구체적인 건축자를 쉽게 교체하거나 새로운 구체적인 건축자를 추가할 수 있다. 사용자는 서로 다른 구체적인 건축자를 사용하면 서로 다른 제품 대상을 얻을 수 있다.지휘자 클래스는 추상적인 건설자를 대상으로 프로그래밍을 하기 때문에 새로운 구체적인 건설자를 늘릴 때 기존 라이브러리의 코드를 수정할 필요가 없고 시스템 확장이 편리하며'개폐원칙'에 부합된다.
(3) 제품의 생성 과정을 더욱 세밀하게 제어할 수 있다.복잡한 제품의 창설 절차를 서로 다른 방법에서 분해하여 창설 과정을 더욱 명확하게 하고 프로그램으로 창설 과정을 제어하는 데 더욱 편리하다.
2. 주요 단점
(1) 건설자 모델이 만든 제품은 일반적으로 비교적 많은 공통점을 가지고 그 구성 부분이 비슷하다. 만약에 제품 간의 차이가 매우 크면 예를 들어 많은 구성 부분이 같지 않아 건설자 모델을 사용하기에 적합하지 않기 때문에 그 사용 범위는 일정한 제한을 받는다.
(2) 만약에 제품의 내부 변화가 복잡하면 구체적인 건설자 유형을 많이 정의하여 이런 변화를 실현해야 하기 때문에 시스템이 방대해지고 시스템의 이해 난이도와 운행 원가를 증가시킬 수 있다.
3. 적용 장면
다음과 같은 경우 작성자 모드를 사용하는 것을 고려할 수 있습니다. (1) 생성해야 하는 제품 객체는 복잡한 내부 구조가 있는데 이런 제품 객체는 보통 여러 구성원 속성을 포함합니다.(2) 생성해야 하는 제품 대상의 속성은 서로 의존하고 생성 순서를 지정해야 한다.(3) 객체의 작성 프로세스는 해당 객체를 작성한 클래스와 독립적입니다.건설자 모델에서 지휘자 클래스를 도입함으로써 창설 과정을 지휘자 클래스에 봉하고 건설자 클래스와 고객 클래스에 봉하지 않는다.(4) 복잡한 객체의 작성 및 사용을 격리하고 동일한 작성 프로세스를 통해 다른 제품을 작성할 수 있습니다.
【작가: 류웨이http://blog.csdn.net/lovelion】

좋은 웹페이지 즐겨찾기