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

回到顶部