建造者模式(Builder)
是我认为在创建型模式中算比较难理解的一种模式。
建造者模式和抽象工厂模式有点相似都是去创建组合,但是抽象工厂用的多,建造者不常用。
建造者模式的特点就是将创建和表示分离。
继续以游戏为例,我们玩游戏创建英雄的时候,首先去抽象一个抽象建造者类,接着所有的英雄都继承这个抽象类。而Hero类是 英雄的表示类,与创建分离,所有英雄都可以通过这个类表示出来。
如果需要增加英雄就直接添加一个类似Class GuanYu的类就好,在客户端切换。
记录代码如下:
<?php
Class Hero
{
// 技能
public $_skill;
// 武器
public $_weapon;
// 坐骑
public $_horse;
/** 英雄表示方法,不同英雄又不同表示
* Display
*/
function Display()
{
echo "绝招是:{$this->_skill}";
echo "武器是:{$this->_weapon}";
echo "坐骑是:{$this->_horse}";
}
}
/** 英雄建造器 抽象类
* abstract HeroBuilder
*/
abstract Class HeroBuilder
{
protected $_hero;
function __construct()
{
$this->_hero = new Hero();
}
//抽象英雄绝招方法
abstract function HeroSkill();
//抽象英雄武器方法
abstract function HeroWeapon();
//抽象英雄坐骑方法
abstract function HeroHorse();
// 创建英雄方法
abstract function CreateHero();
}
/** 关羽英雄类 继承抽象类必须完成抽象方法
* GuanYu
*/
Class GuanYu extends HeroBuilder
{
function HeroSkill()
{
$this->_hero->_skill = "拖刀计<br/>";
}
function HeroWeapon()
{
$this->_hero->_weapon = "青龙偃月刀<br/>";
}
function HeroHorse()
{
$this->_hero->_horse = "赤兔马<br/>";
}
function CreateHero()
{
return $this->_hero;
}
}
/** 英雄接口类
* HeroApi
*/
Class HeroApi
{
function Create($_obj)
{
$_obj->HeroSkill();
$_obj->HeroWeapon();
$_obj->HeroHorse();
return $_obj->CreateHero();
}
}
<?php
// 建造者模式 index.php
header("Content-Type:text/html;charset=utf-8");
require_once "Builder.php";
// 英雄接口类
$obj = new HeroApi();
// 创建关羽英雄对象 以后想用什么就创建什么
$guanyu = new GuanYu();
// 创建加入战场
$guanyuhero = $obj->Create($guanyu);
echo "关羽加入战场<br/>";
$guanyuhero->Display();// 展示
输出结果:
关羽加入战场
绝招是:拖刀计
武器是:青龙偃月刀
坐骑是:赤兔马