建造者模式是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以产生不同的表示。

例如我们的玩具厂,一套相同的流程可以产生不同的玩具,都需要建模,塑造,包装等等。

首先定义一个产品类:

class Product {

protected $parts = array ();

public function addPart($part)
{
    array_push($this->parts,$part);
}

public function show()
{
    foreach ($this->parts as $v) {
        echo $v.'<br>';
    }
}
}

其次,定义一个建造者抽象类(Builder.php):

abstract class Builder {

protected $product = null;

abstract public function builderA();

abstract public function builderB();

public function getResult()
{
    return $this->product;
}
}

构建建造者实例对象:

class ConcreteBuilderA extends Builder {

// protected $product = null;
public function __construct($product)
{
    $this->product = $product;
}
public function builderA()
{
    $this->product->addPart('my is part A');
}

public function builderB()
{
    $this->product->addPart('my is part B');
}

}

class ConcreteBuilderB extends Builder {

// protected $product = null;
public function __construct($product)
{
    $this->product = $product;
}
public function builderA()
{
    $this->product->addPart('my is part AA');
}

public function builderB()
{
    $this->product->addPart('my is part BB');
}

}

指挥类:

class Director {

public function setBuilder(Builder $builder)
{
    $builder->builderA();
    $builder->builderB();
}
}

客户端代码:

$ba = new ConcreteBuilderA(new Product());
$bb = new ConcreteBuilderB(new Product());

$director = new Director();
$director->setBuilder($ba);
$p1 = $ba->getResult();
$director->setBuilder($bb);
$p2 = $bb->getResult();

$p1->show();
$p2->show();

结果:

my is part A
my is part B
my is part AA
my is part BB