php-建造者模式实现

发布于 2021-09-04 17:26 ,所属分类:软件编程学习资料


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


模式举例

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


模式结构

建造者模式包含如下角色:
以本文实例代码为参考
MotorcycleProduce-摩托组装抽象类:建立摩托组装标准工艺
MotorcycleScooterProduce-踏板摩托车组装者:负责踏板摩托车的组装工作
MotorcycleStraddleProduce:跨骑摩托组装者:负责跨骑摩托的组装工作
Director:主管类:负责摩托组装工作的具体分配和流程安排
MotocycleProduct:摩托车产品实体:最终形成产品并形成产品实体


图例

以本文实例代码为参考


代码实例

<?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调用建造者相关的方法,从而返回一个完整的产品实例。

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


优缺点

建造者模式优点
  1. 客户端无需知道产品内部实现细节,将产品的创建与本身解耦。使得相同的创建过程可以创建不同的产品对象

  2. 增加新的具体建造者类无需修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合“开闭原则”

  3. 创建者类相对独立,互不干扰,因此可以很方便的替换和新增具体建造者类。客户端可以通过不同的建造者类得到的不同的产品对象。

  4. 使得创建过程更加清晰,也更方便的控制产品的创建过程。

建造者模式缺点

  1. 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。

  2. 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。



适用环境

  1. 需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性。

  2. 需要生成的产品对象的属性相互依赖,需要指定其生成顺序。

  3. 对象的创建过程独立于创建该对象的类。在建造者模式中引入了指挥者类,将创建过程封装在指挥者类中,而不在建造者类中。

  4. 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。






文章都看完了不点个 分享吗




- The End -



相关资源