建造者模式
<h3>建造者模式</h3>
<ul>
<li>也称生成器模式。将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示</li>
<li>有时候,如果建造者对他所创建的东西拥有较好的知识储备,这个接口就可能成为一个有默认方法的抽象类(又称为适配器)。</li>
<li>如果对象有复杂的继承树,那么对于建造者来说,有一个复杂继承树也是符合逻辑的。</li>
<li><strong>注意:</strong>建造者通常有一个「流式接口」,例如 PHPUnit 模拟生成器。</li>
</ul>
<h3>为什么需要建造者模式</h3>
<ul>
<li>对象的生产需要复杂的初始化,比如给一大堆类成员属性赋初值,设置一下其他的系统环境变量。使用建造者模式可以将这些初始化工作封装起来。</li>
<li>对象的生成时可根据初始化的顺序或数据不同,而生成不同角色。</li>
</ul>
<h3>实例</h3>
<ul>
<li>在很多游戏软件中,地图包括天空、地面、背景等组成部分,人物角色包括人体、服装、装备等组成部分,
<ul>
<li>可以使用建造者模式对其进行设计,通过不同的具体建造者创建不同类型的地图或人物</li>
</ul></li>
<li>汽车,他的发动机引擎有好多品牌,轮胎也有各种材质,内饰更是千奇百怪;</li>
<li>鸟,他的头、翅膀以及脚有各种颜色和形状,在创建这种复杂对象的时候,我们建议使用建造者模式。</li>
</ul>
<h3>建造者模式一般认为有四个角色:</h3>
<ul>
<li>1.产品角色,产品角色定义自身的组成属性</li>
<li>2.抽象建造者,抽象建造者定义了产品的创建过程以及如何返回一个产品</li>
<li>3.具体建造者,具体建造者实现了抽象建造者创建产品过程的方法,给产品的具体属性进行赋值定义</li>
<li>4.指挥者,指挥者负责与调用客户端交互,决定创建什么样的产品</li>
</ul>
<h3>代码示例</h3>
<pre><code class="language-php"><?php
/**
* 建造者模式
*/
/**具体产品角色 鸟类
* Class Bird
*/
class Bird
{
public $_head;
public $_wing;
public $_foot;
public function show()
{
echo "头的颜色:{$this->_head}<br/>";
echo "翅膀的颜色:{$this->_wing}<br/>";
echo "脚的颜色:{$this->_foot}<br/>";
}
}
/**抽象鸟的建造者(生成器)
* Class BirdBuilder
*/
abstract class BirdBuilder
{
protected $_bird;
public function __construct()
{
$this->_bird=new Bird();
}
abstract public function BuildHead();
abstract public function BuildWing();
abstract public function BuildFoot();
abstract public function GetBird();
}
/**具体鸟的建造者(生成器) 蓝鸟
* Class BlueBird
*/
class BlueBird extends BirdBuilder
{
public function BuildHead()
{
// TODO: Implement BuilderHead() method.
$this->_bird->_head="Blue";
}
public function BuildWing()
{
// TODO: Implement BuilderWing() method.
$this->_bird->_wing="Blue";
}
public function BuildFoot()
{
// TODO: Implement BuilderFoot() method.
$this->_bird->_foot="Blue";
}
public function GetBird()
{
// TODO: Implement GetBird() method.
return $this->_bird;
}
}
/**玫瑰鸟
* Class RoseBird
*/
class RoseBird extends BirdBuilder
{
public function BuildHead()
{
// TODO: Implement BuildHead() method.
$this->_bird->_head="Red";
}
public function BuildWing()
{
// TODO: Implement BuildWing() method.
$this->_bird->_wing="Black";
}
public function BuildFoot()
{
// TODO: Implement BuildFoot() method.
$this->_bird->_foot="Green";
}
public function GetBird()
{
// TODO: Implement GetBird() method.
return $this->_bird;
}
}
/**指挥者
* Class Director
*/
class Director
{
/**
* @param $_builder 建造者
* @return mixed 产品类:鸟
*/
public function Construct($_builder)
{
$_builder->BuildHead();
$_builder->BuildWing();
$_builder->BuildFoot();
return $_builder->GetBird();
}
}
$director=new Director();
echo "蓝鸟的组成:<hr/>";
$blue_bird=$director->Construct(new BlueBird());
$blue_bird->Show();
echo "<br/>Rose鸟的组成:<hr/>";
$rose_bird=$director->Construct(new RoseBird());
$rose_bird->Show();
</code></pre>