php-建造者模式实现

php-建造者模式实现

概述

建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。建造者模式属于对象创建型模式。根据中文翻译的不同,建造者模式又可以称为生成器模式。

这里我们还是以工厂模式以及抽象工厂模式使用到的现实例子为例

现在有一个摩托车制造厂,它生产踏板摩托和跨骑摩托车,踏板车和跨骑车都是由发动机、车身和轮子组成的。我们这里踏板车和跨骑车的组装工作分配给两个工作人员/生产线处理。由组装部主管分配具体生产任务。这里我们就用到了建造者设计模式。

模式结构

建造者模式包含如下角色:

以本文实例代码为参考

  1. MotorcycleProduce-摩托组装抽象类:建立摩托组装标准工艺
  2. MotorcycleScooterProduce-踏板摩托车组装者:负责踏板摩托车的组装工作
  3. MotorcycleStraddleProduce:跨骑摩托组装者:负责跨骑摩托的组装工作
  4. Director:主管类:负责摩托组装工作的具体分配和流程安排
  5. MotocycleProduct:摩托车产品实体:最终形成产品并形成产品实体

UML图例

在这里插入图片描述

代码实例

<?php
//抽象类-定义生产摩托车流水线标准
abstract class MotorcycleProduce
{
    protected $motor;
    //发动机方法
    public abstract function addEngine();
    //车身方法
    public abstract function addBody();
    //车轮方法
    public abstract function addWhell();
    //获取摩托
    public abstract function getMotor();
}
/**
 * 踏板摩托组装
 */
class MotorcycleScooterProduce extends MotorcycleProduce
{
    public function __construct()
    {
        $this->motor = new MotocycleProduct();
    }
    public function addEngine()
    {
        $this->motor->addEngine("踏板摩托-发动机已装好");
    }
    public function addBody(){
        $this->motor->addBody("踏板摩托-车身已装好");
    }
    public function addWhell(){
        $this->motor->addWhell("踏板摩托-车轮已装好");
    }
    public function getMotor(){
        return $this->motor;
    }
}
/**
 * 跨骑摩托组装
 */
class MotorcycleStraddleProduce extends MotorcycleProduce
{
    public function __construct()
    {
        $this->motor = new MotocycleProduct();
    }
    public function addEngine()
    {
        $this->motor->addEngine("跨骑摩托-发动机已装好");
    }
    public function addBody(){
        $this->motor->addBody("跨骑摩托-车身已装好");
    }
    public function addWhell(){
        $this->motor->addWhell("跨骑摩托-车轮已装好");
    }
    public function getMotor(){
        return $this->motor;
    }
}
//安排生产线开始组装摩托
class Director{
    public function assemble(MotorcycleProduce $motorcycleProduce){
        $motorcycleProduce->addEngine();
        $motorcycleProduce->addBody();
        $motorcycleProduce->addWhell();
    }
}
//摩托车产品本身
class MotocycleProduct{
    private $motor = [
        "engine"=>"",
        "body"=>"",
        "whell"=>""
    ];
    //新增发动机零部件
    public function addEngine($engine){
        $this->motor["engine"] = $engine;
    }
    public function addBody($body){
        $this->motor["body"] = $body;
    }
    public function addWhell($whell){
        $this->motor["whell"] = $whell;
    }
    //获取完整摩托对象
    public function getMotor(){
        return $this->motor;
    }
}
//分配任务管理者
$director = new Director();

//踏板摩托车
$motorcycleScooterProduce = new MotorcycleScooterProduce;
$director->assemble($motorcycleScooterProduce);
$motorcycleScooter = $motorcycleScooterProduce->getMotor();
var_dump($motorcycleScooter);
echo "<br>";
//跨骑摩托车
$motorcycleStraddleProduce = new MotorcycleStraddleProduce;
$director->assemble($motorcycleStraddleProduce);
$motorcycleStraddle = $motorcycleStraddleProduce->getMotor();
var_dump($motorcycleStraddle);

模式分析

抽象建造者类 MotorcycleProduce 定义了产品的创建方法和返回方法;

建造者模式还引入了一个任务指挥者Director,该类的作用主要是隔离了客户与组装过程,另外负责控制产品的组装流程工艺。指挥者依赖于抽象建造者类进行编程,调用者只需要知道具体创建者的归属,即可通过Director调用建造者相关的方法,从而返回一个完整的产品实例。

在客户端代码中,无须关心产品对象的具体组装过程,只需确定具体建造者的类型即可,建造者模式将复杂对象的构建与对象的表现分离开来,这样使得同样的构建过程可以创建出不同的表现。

优缺点

建造者模式优点

  • 客户端无需知道产品内部实现细节,将产品的创建与本身解耦。使得相同的创建过程可以创建不同的产品对象
  • 增加新的具体建造者类无需修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合“开闭原则”
  • 创建者类相对独立,互不干扰,因此可以很方便的替换和新增具体建造者类。客户端可以通过不同的建造者类得到的不同的产品对象。
  • 使得创建过程更加清晰,也更方便的控制产品的创建过程。

建造者模式缺点

  • 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
  • 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

适用环境

  • 需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性。
  • 需要生成的产品对象的属性相互依赖,需要指定其生成顺序。
  • 对象的创建过程独立于创建该对象的类。在建造者模式中引入了指挥者类,将创建过程封装在指挥者类中,而不在建造者类中。
  • 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。

更多模式实例请参考本专栏文章

设计模式分类(拒绝空谈-针对每种模式都包含代码实战,讲解,图例,结构分析等部分)

关注微信公众号(yuantanphp)
回复关键字 设计模式 可获取以下材料
《设计模式:可复用面向对象软件的基础》pdf版.
php设计模式23种实例实现php源码
在这里插入图片描述
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冯伪猿

觉得文章不错?打赏支持一下吧。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值