您好,欢迎访问代理记账网站
移动应用 微信公众号 联系我们

咨询热线 -

电话 15988168888

联系客服
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

PHP设计模式-- 创建型-- 建造者模式(总结)

原文地址:https://laravelacademy.org/post/2489

1.模型定义(跟抽象工厂比较像,也就是多了一个负责人类)

建造者模式将一个复杂的对象的构建与他的表示分离开,使得同样的构建过程可以创建不同的表示。

2.问题引出

假设我们有一个需要实现一个功能,但实现的方式有很多种,如果每种实现方式都从头到尾按部就班的造必然效率低下也很分散 不好管理

3.解决方法

我们可以试着将类的初始化和功能方法分离开:让一个类似总负责人的角色来负责类的初始化,而具体要使用那种方式让具体的“构造者”去实现,总负责人知道什么样的类怎么初始化,需要的方法则让“构造者”去建造,何时完成由负责人来控制并最终返回给客户端

4.UML类图

5.实例代码--总负责人类

<?php


namespace App\DesignPatterns\Creational\Builder;

/**
 * Director 是建造者模式的一部分,它知道构建者接口并通过构建者构建负责对象
 *
 * 可以通过依赖性注入构建者的方式构建任何复杂对象
 */
class Director
{

    /**
     * 导演
     * @param BuilderInterface $builder
     * @return Parts\Vehicle
     */
    public function build(BuilderInterface $builder)
    {
        $builder->createVehicle();
        $builder->addDoors();
        $builder->addEngine();
        $builder->addWheel();

        return $builder->getVehicle();
    }


}

6.实例代码--构造者接口

<?php


namespace App\DesignPatterns\Creational\Builder;


/**
 * 构造者接口
 * Class BuilderInterface
 * @package App\DesignPatterns\Creational\Builder
 */
interface BuilderInterface
{

    /**
     * 创建车辆
     * @return mixed
     */
    public function createVehicle();


    /**
     * 添加轮子
     * @return mixed
     */
    public function addWheel();


    /**
     * 添加引擎
     * @return mixed
     */
    public function addEngine();


    /**
     * 添加门
     * @return mixed
     */
    public function addDoors();


    /**
     * 获取车辆
     * @return mixed
     */
    public function getVehicle();

}

7.实例代码--具体构造者

<?php


namespace App\DesignPatterns\Creational\Builder;


use App\DesignPatterns\Creational\Builder\Parts\Car;
use App\DesignPatterns\Creational\Builder\Parts\Engine;
use App\DesignPatterns\Creational\Builder\Parts\Wheel;

/**
 * CarBuilder 用于创建汽车
 * Class CarBuilder
 * @package App\DesignPatterns\Creational\Builder
 */
class CarBuilder    implements BuilderInterface
{

    /**
     * @var Car
     */
    protected $car;


    /**
     * 车门
     * @return mixed|void
     */
    public function addDoors()
    {
        $this->car->setPart("rightdoor", new Car());
        $this->car->setPart("leftDoor", new Car());
    }


    /**
     * 引擎
     * @return mixed|void
     */
    public function addEngine()
    {
        $this->car->setPart("engine", new Engine());
    }


    /**
     * 车门
     * @return mixed|void
     */
    public function addWheel()
    {
        $this->car->setPart("wheelLF", new Wheel());
        $this->car->setPart("wheelRF", new Wheel());
        $this->car->setPart("wheelLR", new Wheel());
        $this->car->setPart("wheelRR", new Wheel());
    }


    /**
     * 创建车
     * @return mixed|void
     */
    public function createVehicle()
    {
        $this->car = new Car();
    }

    /**
     * 获取车辆
     * @return Car|mixed
     */
    public function getVehicle()
    {
        return $this->car;
    }

}

8.实例代码--组件类

<?php


namespace App\DesignPatterns\Creational\Builder\Parts;

/**
 * Class Vehicle
 * @package App\DesignPatterns\Creational\Builder\Parts
 */
abstract class Vehicle
{

    /**
     * @var array
     */
    protected $data;

    /**
     * @param string $key
     * @param mixed $value
     */
    public function setPart($key, $value)
    {
        $this->data[$key] = $value;
    }

}
<?php


namespace App\DesignPatterns\Creational\Builder\Parts;


class Car   extends Vehicle
{

    /**
     * @return array
     */
    public function getData(): array
    {
        return $this->data;
    }


    /**
     * @param array $data
     */
    public function setData(array $data): void
    {
        $this->data = $data;
    }





}

9.总结

建造者模式和抽象工厂模式很像,总体上,建造者模式仅仅只比抽象工厂多一个“导演类”的角色。与抽象工厂模式相比,建造者模式一般用来创建更为复杂的对象,因为对象的创建过程更为复杂,因此将对象的创建过程独立出来组成一个新的类---导演类。也就是说,抽象工厂模式是将对象的全部创建过程封装在工厂类中,由工厂类向客户端提供最终的产品;而建造者模式中,建造者类一般只提供产品类中各个组件的建造,而将完整建造过程交付给导演类。由导演类负责将各个组件按照特定的规则组建为产品,然后将组建好的产品交付给客户端。


分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进