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


