建造者模式
是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以产生不同的表示。
例如我们的玩具厂,一套相同的流程可以产生不同的玩具,都需要建模,塑造,包装等等。
首先定义一个产品类:
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