2016-09-27 3 views
0

빌더 패턴에 둘 이상의 디렉터가있을 수 있는지 알고 싶습니까? 때문에 다른 구현을 가진 개체를 빌드해야합니다. 내가 반대하는 다른 슬러그를 추가 할 foreach 문을 사용 할 수 있도록 예를 들어빌더 패턴 하나 이상의 디렉터

,

은 언젠가 목적은 슬러그로 구성된다.

//Director 1 

function build ($obj) { 
    foreach($slugs as $slug) { 
     $object = $obj->createObject($slug); 
     $object->buildItem1(); 
     $object->buildItem2(); 
    } 
} 

하지만 다른 경우에는 개체가 모든 줄마다 작성됩니다.

//Director 2 

function build ($obj) { 
    $object = $obj->createObject(); 
    $object->buildItem1(); 
    $object->buildItem2(); 
} 

답변

0

당신이 쓴 :

내가 다른 구현이 객체를 구축해야합니다.

다른 클래스의 다른 구현 개체가있는 개체가 아닌가요?

the builder pattern에는 실제 건물을 담당하는 Director 개체가 있습니다. 원하는 제품을 빌드 할 수있는 구체적인 작성기 오브젝트를 인스턴스화하고 감독에게 오브젝트를 빌드하기 위해 concree-builder를 사용하도록 요청하십시오.

콘크리트 빌더는 클래스 빌더에서 파생되거나 IBuild 인터페이스를 구현합니다. 감독은 빌더를 만드는 방법을 알고 있으며 제품을 빌드하는 데 적절한 기능을 호출합니다.

전형적인 예는 오토바이와 자동차를 만들려는 경우입니다. MotorCycleBuilder와 CarBuilder라는 파생 클래스 두 개가있는 클래스 또는 인터페이스 VehicleBuilder가 있습니다. 제품으로 원하는 것을 따라 MotorCycleBuilder 또는 CarBuilder를 구성하고 디렉토리를 주문하여 제품을 빌드하십시오.

질문으로 돌아 가기. 제품 A와 제품 B의 두 종류의 제품을 만들 수 있기를 원합니다. 제품이 동일한 클래스 또는 다른 클래스 일 수 있습니다.

이 경우 빌더 패턴을 사용하려면 ABuilder와 BBuilder를 설계해야합니다. ABuilder는 제품 A를 제공하고 BBuilders는 제품 B를 제공합니다. ABuilder와 BBuilder는 모두 Builder에서 파생되었거나 IBuild와 같은 공통 인터페이스를 가지고 있습니다.

이제 제품 A 또는 A를 빌드 할 것인지 결정한 후 다음 ABuilder 및 BBuilder 모두 이러한 기능과 이러한 기능과 ibuild에 인터페이스를 구현해야합니다) 당신이 BuildStep1()와 BuildStep2을 (해야 할 제품을 구축 할 생각 지금

Builder myBuilder = isProductARequested ? new ABuilder() : new BBuilder(); 
Director myDirector = new Director(); 
Product myProduct = myDirector.Build(myBuilder); 

, 또는 : 제품 B는 다음을 수행 BuildStep1() 및 BuildStep2() 함수를 사용하여 추상 클래스에서 파생됩니다.

BuildStep1과 BuildStep2의 실제 구현은 다른 제품이 빌드되었는지 확인합니다. 이러한 제품은 유형이 동일하거나 유형이 다를 수 있습니다.