5°

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());

互相探讨...

本文由【山人有妙计】发布于开源中国,原文链接:https://my.oschina.net/hackdebug/blog/3158070

全部评论: 0

    我有话说: