创建型设计模式->建造者模式

  • 建造者模式一般有四个角色
    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();

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 记录结构: 1.前言 没有人买车会只买一个轮胎或者方向盘,大家买的都是一辆包含轮胎、方向盘和发动机等多个部件的完整...
    markfork阅读 4,090评论 0 4
  • 设计模式概述 在学习面向对象七大设计原则时需要注意以下几点:a) 高内聚、低耦合和单一职能的“冲突”实际上,这两者...
    彦帧阅读 9,153评论 0 14
  • 一、概念 1.1、定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式将一个...
    双鱼子曰1987阅读 1,638评论 0 0
  • 定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 主要作用 在用户不知道对象的建造过...
    充满活力的早晨阅读 2,767评论 0 2
  • 字节跳动飞书内推!北京、杭州、武汉、广州、深圳、上海,六大城市等你来投。感兴趣的朋友可以私我咨询&内推,也可以通过...
    卢卡斯哔哔哔阅读 3,805评论 0 3