-
建造者模式一般有四个角色
1.产品角色,产品角色定义自身组成单的属性
2.抽象建造者,抽象建造者定义了产品的创建过程以及后返回一个产品
3,具体建造者,具体建造者实现了抽象建造者的抽象方法,以及给产品的属性进行赋值
4.指挥者负责与客户端进行交互,决定创建什么样的产品 -
建造者模式的优点
1.封装性,使用建造者模式可以使客户端不用知道产品内部组成的细节
2.扩展性,建造者独立,已经定义好了产品自身组成的属性,容易扩展
3.便于控制细节风险,由于每个建造者是相互独立的,比较容易细化 -
应用
1.支付类(微信,支付宝等) -
建造者模式与工厂模式很像,
1.建造者关注的是零件类型和装配工艺(顺序),这是他与工厂最大的不同,同为创建型的模式,关注点不同
2.建造者模式最主要的功能是基本方法的调用顺序安排,也就是这些基本方法已经实现了,通俗地说就是零件的装配,顺序不同产生的对象也不同
3.工厂模式关注点是创建,顺序不关心 -
代码1
<?php
// 产品接口
interface ICar {
public function start();
public function run();
public function stop();
}
// 产品类
final class Benz implements ICar {
public function start() {
echo 'Benz start the engine' . PHP_EOL;
}
public function run() {
echo 'Benz run' . PHP_EOL;
}
public function stop() {
echo 'Benz stop the engin' . PHP_EOL;
}
}
// 抽象建造者
abstract class ABuilder {
abstract public function build($seqeunce = array());
}
// 具体建造者
final class BenzBuilder extends ABuilder {
private $_benz = null;
private $_default_sequence = array(
'start',
'run',
'stop'
);
public function __construct() {
$this->_benz = new Benz();
}
public function build($sequence = array()) {
foreach (empty($sequence) ? $this->_default_sequence : $sequence as $val) {
$this->_benz->$val();
}
}
}
// 导演类
final class BenzDirector {
public function getBenzA() {
$benz = new BenzBuilder();
$benz->build(array('run', 'start'));
}
public function getBenzB() {
$benz = new BenzBuilder();
$benz->build();
}
}
$director = new BenzDirector();
echo str_repeat('-', 5) . 'build benz serial A' . str_repeat('-', 5) . PHP_EOL;
$director->getBenzA();
echo str_repeat('-', 5) . 'build benz serial B' . str_repeat('-', 5) . PHP_EOL;
$director->getBenzB();
- 代码2
<?php
/**
* Created by PhpStorm.
* User: Jiang
* Date: 2015/4/25
* Time: 9:31
*/
/**具体产品角色 鸟类
* Class Bird
*/
class Bird
{
public $_head;
public $_wing;
public $_foot;
function show()
{
echo "头的颜色:{$this->_head}<br/>";
echo "翅膀的颜色:{$this->_wing}<br/>";
echo "脚的颜色:{$this->_foot}<br/>";
}
}
/**抽象鸟的建造者(生成器)
* Class BirdBuilder
*/
abstract class BirdBuilder
{
protected $_bird;
function __construct()
{
$this->_bird=new Bird();
}
abstract function BuildHead();
abstract function BuildWing();
abstract function BuildFoot();
abstract function GetBird();
}
/**具体鸟的建造者(生成器) 蓝鸟
* Class BlueBird
*/
class BlueBird extends BirdBuilder
{
function BuildHead()
{
// TODO: Implement BuilderHead() method.
$this->_bird->_head="Blue";
}
function BuildWing()
{
// TODO: Implement BuilderWing() method.
$this->_bird->_wing="Blue";
}
function BuildFoot()
{
// TODO: Implement BuilderFoot() method.
$this->_bird->_foot="Blue";
}
function GetBird()
{
// TODO: Implement GetBird() method.
return $this->_bird;
}
}
/**玫瑰鸟
* Class RoseBird
*/
class RoseBird extends BirdBuilder
{
function BuildHead()
{
// TODO: Implement BuildHead() method.
$this->_bird->_head="Red";
}
function BuildWing()
{
// TODO: Implement BuildWing() method.
$this->_bird->_wing="Black";
}
function BuildFoot()
{
// TODO: Implement BuildFoot() method.
$this->_bird->_foot="Green";
}
function GetBird()
{
// TODO: Implement GetBird() method.
return $this->_bird;
}
}
/**指挥者
* Class Director
*/
class Director
{
/**
* @param $_builder 建造者
* @return mixed 产品类:鸟
*/
function Construct($_builder)
{
$_builder->BuildHead();
$_builder->BuildWing();
$_builder->BuildFoot();
return $_builder->GetBird();
}
}
- 调用客户端代码
header("Content-Type:text/html;charset=utf-8");
//------------------------生成器模式测试代码------------------
require_once "./Builder/Builder.php";
$director=new Director();
echo "蓝鸟的组成:<hr/>";
$blue_bird=$director->Construct(new BlueBird());
$blue_bird->Show();
echo "<br/>Rose鸟的组成:<hr/>";
$rose_bird=$director->Construct(new RoseBird());
$rose_bird->Show();
网友评论