美文网首页
创建型设计模式->建造者模式

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

作者: liu66_net | 来源:发表于2018-12-04 14:21 被阅读0次
  • 建造者模式一般有四个角色
    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();

相关文章

  • 建造者设计模式-Builder design pattern

    建造者设计模式是创建型设计模式的一种。创建型设计模式处理对象创建的问题。 建造者设计模式,用来构建需要经过若干个建...

  • 设计模式-构建者模式

    概念 建造者模式(英:Builder Pattern)是一种创建型设计模式,又名:生成器模式。GOF 给建造者模式...

  • spring 设计模式篇(前)

    设计模式俗称:套路 一、spring常见设计模式 (23种设计模式) 创建型:工厂方法模式、抽象工厂模式、建造者...

  • 23天学习23种设计模式——建造者模式

    是什么——什么是建造者模式 建造者模式(Builder Pattern),是一种对象创建型设计模式。它将一个复杂对...

  • 设计模式之建造者模式

    设计模式之建造者模式 Intro 简介 建造者模式: 建造者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加...

  • 手撸golang 创建型设计模式 建造者模式

    手撸golang 创建型设计模式 建造者模式 缘起 最近复习设计模式拜读谭勇德的<<设计模式就该这样学>>本系列笔...

  • JavaScript设计模式

    设计模式分类(23种设计模式) 创建型单例模式原型模式工厂模式抽象工厂模式建造者模式 结构型适配器模式装饰器模式代...

  • Java 设计模式(二)《建造者模式》

    博客专栏 建造者模式 类型: 创建型 难度:中级 更多设计模式小故事案例代码详解 >>点我!点我!点我!<< 设计...

  • Retrofit

    Retrofit设计模式 动态代理,装饰模式,建造者模式,抽象工厂模式,适配器模式 建造者模式创建Retrofit...

  • 2021-11-16 - 学习记录

    设计模式学习:创建型:工厂(工厂方法,抽象工厂),建造者,单例,原型 设计模式:工厂模式 简单工厂 工厂方法 抽象工厂

网友评论

      本文标题:创建型设计模式->建造者模式

      本文链接:https://www.haomeiwen.com/subject/utpmcqtx.html