php设计模式之生成器模式(或建造者模式)
/生成器模式即建造者模式
//建造两种房子,土房和砖房两种房子
//只有当产品较为复杂且需要详细配置时,使用生成器模式才有意义interface House
{
}
//土房
class SoilHouse implements House
{
public $walls;
public $doors;
public $roof;
}
//砖房
class BrickHouse implements House
{
public $walls;
public $doors;
public $roof;
}
//生成器接口声明了创建产品对象不同部件的方法。
interface Builder
{
public function reset();
public function buildWalls(); //墙
public function buildDoors(); //门
public function buildRoof(); //屋顶
public function getResult();
// public function builde();
}
//具体建造者(土房) 以不同方式实现的生成器变体。
class SoilBuilder implements Builder
{
public $soilHouse;
public function __construct()
{
$this->reset();
}
//reset(重置)方法可清除正在生成的对象。
public function reset()
{
$this->soilHouse = new SoilHouse();
}
//所有生成步骤都会与同一个产品实例进行交互。
public function buildWalls()
{
$this->soilHouse->walls = "我是土房->墙";
}
public function buildDoors()
{
$this->soilHouse->doors = "我是土房->门";
}
public function buildRoof()
{
$this->soilHouse->roof = "我是土房->墙顶";
}
//或者直接一个方法生成产品
/* public function builde()
{
$this->soilHouse->walls = "我是土房->墙";
$this->soilHouse->doors = "我是土房->门";
$this->soilHouse->roof = "我是土房->墙顶";
}*/
/*具体生成器需要自行提供获取结果的方法。这是因为不同类型的生成器可能
会创建不遵循相同接口的、完全不同的产品。所以也就无法在生成器接口中
声明这些方法(至少在静态类型的编程语言中是这样的)。
通常在生成器实例将结果返回给客户端后,它们应该做好生成另一个产品的
准备。因此生成器实例通常会在 `getResult(获取产品)`方法主体末尾
调用重置方法。但是该行为并不是必需的,你也可让生成器等待客户端明确
调用重置方法后再去处理之前的结果。*/
public function getResult()
{
return $this->soilHouse;
}
}
//具体建造者 砖房 生成器与其他创建型模式的不同之处在于:它让你能创建不遵循相同接口的产品
class BrickBuilder implements Builder
{
public $soilHouse;
public function __construct()
{
$this->reset();
}
public function reset()
{
$this->soilHouse = new BrickHouse();
}
public function buildWalls()
{
$this->soilHouse->walls = "我是砖房->墙";
}
public function buildDoors()
{
$this->soilHouse->doors = "我是砖房->门";
}
public function buildRoof()
{
$this->soilHouse->roof = "我是砖房->墙顶";
}
public function getResult()
{
return $this->soilHouse;
}
}
/*主管只负责按照特定顺序执行生成步骤。其在根据特定步骤或配置来生成产品时
会很有帮助。由于客户端可以直接控制生成器,所以严格意义上来说,主管类并
不是必需的*/
class Director
{
public $builder;
public function __construct(Builder $builder)
{
$this->builder = $builder;
}
//土房 主管可同由客户端代码传递给自身的任何生成器实例进行交互。客户端可通
// 过这种方式改变最新组装完毕的产品的最终类型。
public function builderSoil()
{
$this->builder->buildWalls();
$this->builder->buildDoors();
$this->builder->buildRoof();
}
//砖房 主管可使用同样的生成步骤创建多个产品变体。
public function builderBrick()
{
$this->builder->buildWalls();
$this->builder->buildDoors();
$this->builder->buildRoof();
}
}
$soilBuilder = new SoilBuilder();
$client = new Director($soilBuilder);
$client->builderSoil();
var_dump($soilBuilder->getResult());
echo "<br/>";
$builder = new BrickBuilder();
$client = new Director($builder);
$client->builderSoil();
var_dump($builder->getResult());
互相探讨...
以上是 php设计模式之生成器模式(或建造者模式) 的全部内容, 来源链接: utcz.com/z/512711.html