디자인 패턴 [창조적] 06-- 빌더 모드 (빌더)

I. 서론

그것이 나 소프트웨어 시스템으로, 현실 세계에서 어떤 복잡한 물체가 있는지, 그들은 휠, 스티어링 휠, 송신기 및 기타 구성 요소를 포함하는 등 자동차와 같은 요소의 복수가 있습니다. 대부분의 사용자의 경우, 이러한 구성 요소의 세부 사항을 모른 채 거의 구성 요소가 단독으로 사용, 조립,하지만 전체 자동차의 사용은 설계 할 수와 빌더 모드, 빌더 패턴에 의해 설명 및 조립 공정은 복잡한 객체를 생성하기 위해 단계적으로 분리 될 수있다. 사용자는 내부 구조의 구체적인 세부 사항을 알 필요없이 객체를 얻을 수 복잡한 객체의 유형을 지정해야합니다.

자동차가 구축 될 복잡한 객체는 등가이며, 물체의 특성은 차량의 일부에, 구성 요소 프로세스의 조합의 공정의 생성물에 해당 대응한다. 구성 요소의 프로세스 조합은 매우 복잡하기 때문에, 이러한 구성 요소의 조합 프로세스가 종종라는 개체 빌더에 "구체화"되어 있기 때문에, 빌더는 이미 내장 된 완벽한 제품 객체가 완료되고 클라이언트에 반환하고, 사용자가 필요로하지 않는다 개체 속성과 조립 방법을 포함 관심이 동기 부여 빌더 모드의 모드입니다.

모델 빌더 (빌더 패턴)과 동일한 빌드 프로세스는 다른 표현을 만들 수 있도록 구조물과 복잡한 객체의 분리를 나타낸다. 빌더 패턴이 사용자는 유형과 복합 객체의 내용을 지정하여이를 구축 할 수있는 복잡한 객체를 생성하는 단계에 의해 단계이며, 사용자는 건물의 내부의 특정 세부 사항을 알 필요가 없습니다. 빌더 패턴은 객체 생성 모드의 유형에 속한다. 중국어의 번역에 따라, 또한 빌더 패턴 생성기 모드라고 할 수 있습니다.

두, 장면

예를 들어 : KFC에 가서, 햄버거 등 콜라, 감자 튀김, 튀긴 닭 날개, 일정, 그 포트폴리오는 지속적으로 소위 생성, 변화하고있다 "패키지를."

사용 :
1)의 필요성은 복잡한 내부 구조를 갖는 객체를 생성한다.
2) 내부 속성 오브젝트 자체 의존적 생성해야한다.

때문에 수요의 변화,이 복잡한 주제의 다양한 부분 종종 얼굴에, 주로 때때로는 일반적으로 특정 알고리즘을 하위 개체의 여러 부분으로 구성되어 작품을 만들기 위해 "복잡한 객체"에 직면, 소프트웨어 시스템 빌더 패턴을 해결하기 위해 급격한 변화는 있지만 결합 알고리즘은 상대적으로 안정적이다.

셋째, 계급 구조

빌더 모드는 다음과 같은 역할을 포함한다 :

역할 간결한
건축업자 추상 빌더
ConcreteBuilder 특정 빌더
감독 이사
생성물 제품의 역할
  • 추상 빌더는 제품 및 반환 방법을 생성하는 방법을 정의합니다.
  • 사령관의 효과는 주로 두 가지 : 한편으로는 고객과 생산 공정 분리, 그것은 제품의 생성 과정을 제어해야하는 반면에 있습니다.
  • 클라이언트는 알 필요가 특정 빌더 유형을, 당신은을 통해 할 수있는 관련 클래스 메소드 지휘관 빌더 완전한 제품 타겟을 반환 전화

넷, UML 다이어그램

2021264-4517b441af74a31b.png

V. 코드 분석

여기에 예를 들어 자동차를 빌드합니다.

1, 추상적 인 빌더

interface BuilderInterface
{
    public function createVehicle();

    public function addWheel();

    public function addEngine();

    public function addDoors();

    public function getVehicle();
}

2, 특정 업체

// 建造大卡车
class TruckBuilder implements BuilderInterface
{
    /**
     * @var Truck
     */
    private $truck;

    public function createVehicle(){
        $this->truck = new Truck();
    }

    public function addDoors(){
        $this->truck->setPart('rightDoor', new Door());
        $this->truck->setPart('leftDoor', new Door());
        $this->truck->setPart('trunkLid', new Door());
    }

    public function addEngine(){
        $this->truck->setPart('truckEngine', new Engine());
    }

    public function addWheel(){
        $this->truck->setPart('wheel1', new Wheel());
        $this->truck->setPart('wheel2', new Wheel());
        $this->truck->setPart('wheel3', new Wheel());
        $this->truck->setPart('wheel4', new Wheel());
        $this->truck->setPart('wheel5', new Wheel());
        $this->truck->setPart('wheel6', new Wheel());
    }

    public function getVehicle(){
        return $this->truck;
    }
}

// 建造小汽车
class CarBuilder implements BuilderInterface
{
    /**
     * @var Car
     */
    private $car;

    public function createVehicle(){
        $this->car = new Car();
    }

    public function addDoors(){
        $this->car->setPart('rightDoor', new Door());
        $this->car->setPart('leftDoor', new Door());
    }

    public function addEngine(){
        $this->car->setPart('engine', new Engine());
    }

    public function addWheel(){
        $this->car->setPart('wheelLF', new Wheel());
        $this->car->setPart('wheelRF', new Wheel());
        $this->car->setPart('wheelLR', new Wheel());
        $this->car->setPart('wheelRR', new Wheel());
    }

    public function getVehicle(){
        return $this->car;
    }
}

3 도전

/**
 * Director 类是建造者模式的一部分。 它可以实现建造者模式的接口
 * 并在构建器的帮助下构建一个复杂的对象
 *
 * 您也可以注入许多构建器而不是构建更复杂的对象
 */
class Director
{
    public function build(BuilderInterface $builder)
    {
        $builder->createVehicle();
        $builder->addDoors();
        $builder->addEngine();
        $builder->addWheel();

        return $builder->getVehicle();
    }
}

4, 제품의 역할

// 抽象产品
abstract class Vehicle
{
    /**
     * @var object[]
     */
    private $data = [];

    /**
     * @param string $key
     * @param object $value
     */
    public function setPart($key, $value){
        $this->data[$key] = $value;
    }
}

class Truck extends Vehicle{
}
class Car extends Vehicle{
}

// 产品部件
class Engine{
}
class Wheel{
}
class Door{
}

5, 사용 사례

$diretor = new Director();
$myTruck = $diretor->build(new TruckBuilder());
$myCar = $diretor->build(new CarBuilder());

var_dump($myTruck);
var_dump($myCar);

출력 :

object(Truck)#3 (1) {
  ["data":"Vehicle":private]=>
  array(10) {
    ["rightDoor"]=>
    object(Door)#4 (0) {
    }
    ["leftDoor"]=>
    object(Door)#5 (0) {
    }
    ["trunkLid"]=>
    object(Door)#6 (0) {
    }
    ["truckEngine"]=>
    object(Engine)#7 (0) {
    }
    ["wheel1"]=>
    object(Wheel)#8 (0) {
    }
    ["wheel2"]=>
    object(Wheel)#9 (0) {
    }
    ["wheel3"]=>
    object(Wheel)#10 (0) {
    }
    ["wheel4"]=>
    object(Wheel)#11 (0) {
    }
    ["wheel5"]=>
    object(Wheel)#12 (0) {
    }
    ["wheel6"]=>
    object(Wheel)#13 (0) {
    }
  }
}
object(Car)#14 (1) {
  ["data":"Vehicle":private]=>
  array(7) {
    ["rightDoor"]=>
    object(Door)#15 (0) {
    }
    ["leftDoor"]=>
    object(Door)#16 (0) {
    }
    ["engine"]=>
    object(Engine)#17 (0) {
    }
    ["wheelLF"]=>
    object(Wheel)#18 (0) {
    }
    ["wheelRF"]=>
    object(Wheel)#19 (0) {
    }
    ["wheelLR"]=>
    object(Wheel)#20 (0) {
    }
    ["wheelRR"]=>
    object(Wheel)#21 (0) {
    }
  }
}

여섯 개 특징

1, 장점 :

  • 빌더 모드에서 클라이언트는 제품의 내부 구성, 제품 자체와 동일한 생성 과정은 다른 제품 객체를 생성 할 수 있도록 분리 된 제품을 만드는 과정의 세부 사항을 알 필요가 없습니다.
  • 각 특정 업체에 관계없이 다른 특정 빌더, 상대적으로 독립적이다, 그래서 당신은 쉽게 사용자가 다른 제품 객체를 얻을 수있는 다른 특정 빌더를 사용하여 특정 빌더를 교체하거나 새로운 콘크리트 빌더를 추가 할 수 있습니다.
  • 당신은 더 미세하게 제품을 만드는 과정을 제어 할 수 있습니다. 명확하고 더 쉽게 생성은 생성 프로세스를 제어하는 ​​프로그램을 사용하기 때문에, 다른 방식으로 복잡한 분해 제품을 만드는 단계.
  • 에 맞춰, 추상적 인 빌더 클래스 프로그래밍 시스템의 확장 클래스 사령관을 촉진하기 위해 원래의 클래스 라이브러리 코드를 수정하지 않고 새로운 콘크리트 빌더를 추가 "개폐의 원리."

2. 단점 :

  • 공통점이 있어야 제품은 범위가 제한된다.
  • 복잡한 내부 변경으로 건설 클래스들이 많이있을 것입니다.

3. 참고 :
공장 패턴의 차이는 다음과 같습니다 빌더 모드 더 많은 관심을 조립 부품의 주문.

HTTPS : //www.jianshu.com/p/972e405b1d10 재현

추천

출처blog.csdn.net/weixin_34235105/article/details/91263539