学习php设计模式 php实现建造者模式

yizhihongxing

PHP 设计模式是一种可重复使用的解决特定问题的代码设计方案,建造者模式是其中一种设计模式。下面是学习 PHP 设计模式建造者模式的攻略:

什么是建造者模式

建造者模式是一种创建型设计模式,将一个复杂对象的构建过程和它的表示分离开来,使同样的构建过程可以创建不同的表示。建造者模式通常涉及到一个抽象建造者类和具体的建造者类、指导者类和客户端类。

建造者模式的实现步骤

  1. 定义产品类(Product),这是需要被构建的复杂对象,包含多个部分。
  2. 定义抽象建造者类(Builder),声明构建各个部件的抽象方法。
  3. 定义具体建造者类(ConcreteBuilder),实现抽象建造者类中定义的方法,具体负责创建各个部件。
  4. 定义指导者类(Director),负责实现构建过程中的安排顺序等前期准备工作,以及最终完成产品的组装。
  5. 客户端(Client)通过指导者来创建具有不同属性的产品。

下面用两个简单的示例来说明建造者模式的实现。

示例1:创建一个车辆

假设我们要创建一个车辆,这个车辆包含轮子、引擎等部分。按照实现步骤,我们先定义产品类:

class Vehicle
{
    private $wheels;
    private $engine;

    public function setWheels($wheels)
    {
        $this->wheels = $wheels;
    }

    public function setEngine($engine)
    {
        $this->engine = $engine;
    }
}

接下来定义抽象建造者类:

abstract class VehicleBuilder
{
    protected $vehicle;

    public function createVehicle()
    {
        $this->vehicle = new Vehicle();
    }

    public function getVehicle()
    {
        return $this->vehicle;
    }

    abstract public function buildWheels();

    abstract public function buildEngine();
}

其中,createVehicle() 用来创建一个新的车辆对象,getVehicle() 方法用来返回创建的车辆对象,buildWheels() 和 buildEngine() 是构建车辆轮子和引擎的抽象方法。

现在我们实现具体建造者类,ConcreteBuilderCar:

class ConcreteBuilderCar extends VehicleBuilder
{
    public function buildWheels()
    {
        $this->vehicle->setWheels(4);
    }

    public function buildEngine()
    {
        $this->vehicle->setEngine('petrol');
    }
}

定义完具体建造者类之后,我们需要定义指导者类,也就是 Director 类:

class Director
{
    private $vehicleBuilder;

    public function setBuilder(VehicleBuilder $vehicleBuilder)
    {
        $this->vehicleBuilder = $vehicleBuilder;
    }

    public function getVehicle()
    {
        return $this->vehicleBuilder->getVehicle();
    }

    public function constructVehicle()
    {
        $this->vehicleBuilder->createVehicle();
        $this->vehicleBuilder->buildWheels();
        $this->vehicleBuilder->buildEngine();
    }
}

现在,我们就可以创建车辆了。客户端代码示例:

$builder = new ConcreteBuilderCar();
$director = new Director();
$director->setBuilder($builder);
$director->constructVehicle();
$vehicle = $director->getVehicle();

此时,我们得到了一个包含 4 个轮子和燃油引擎的车辆对象。

示例2:构建电脑

现在,我们来构建一台电脑。根据实现步骤,先定义产品类:

class Computer
{
    private $cpu;
    private $ram;
    private $hdd;
    private $ssd;

    public function setCpu($cpu)
    {
        $this->cpu = $cpu;
    }

    public function setRam($ram)
    {
        $this->ram = $ram;
    }

    public function setHdd($hdd)
    {
        $this->hdd = $hdd;
    }

    public function setSsd($ssd)
    {
        $this->ssd = $ssd;
    }
}

定义完产品类之后,我们定义抽象建造者类:

abstract class ComputerBuilder
{
    protected $computer;

    public function createComputer()
    {
        $this->computer = new Computer();
    }

    public function getComputer()
    {
        return $this->computer;
    }

    abstract public function buildCpu();

    abstract public function buildRam();

    abstract public function buildHdd();

    abstract public function buildSsd();
}

这里同样包括了创建电脑对象的方法,以及构建 CPU、RAM、HDD、SSD 等部分的抽象方法。

接着,我们定义具体建造者类:

class ConcreteBuilderComputer extends ComputerBuilder
{
    public function buildCpu()
    {
        $this->computer->setCpu('Intel Core i7');
    }

    public function buildRam()
    {
        $this->computer->setRam('16G');
    }

    public function buildHdd()
    {
        $this->computer->setHdd('1T');
    }

    public function buildSsd()
    {
        $this->computer->setSsd('512G');
    }
}

定义完具体建造者类之后,我们需要定义指导者类:

class Director
{
    private $computerBuilder;

    public function setBuilder(ComputerBuilder $computerBuilder)
    {
        $this->computerBuilder = $computerBuilder;
    }

    public function getComputer()
    {
        return $this->computerBuilder->getComputer();
    }

    public function constructComputer()
    {
        $this->computerBuilder->createComputer();
        $this->computerBuilder->buildCpu();
        $this->computerBuilder->buildRam();
        $this->computerBuilder->buildHdd();
        $this->computerBuilder->buildSsd();
    }
}

现在,我们就可以创建一台电脑了。客户端代码示例:

$builder = new ConcreteBuilderComputer();
$director = new Director();
$director->setBuilder($builder);
$director->constructComputer();
$computer = $director->getComputer();

此时,我们得到了一台配置为 Intel Core i7,16G RAM,1T HDD,512G SSD 的电脑对象。

以上是建造者模式的简单实现。在实际应用的时候,我们可以通过建造者模式将复杂对象的构建过程与表示分离开来,达到灵活、可扩展、易于维护等优点。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:学习php设计模式 php实现建造者模式 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • thinkPHP简单遍历数组方法分析

    下面是“thinkPHP简单遍历数组方法分析”的完整攻略: 标题 ThinkPHP 简单遍历数组方法 正文 在 ThinkPHP 中,可以通过以下两种方式简单地遍历数组: 1. foreach 循环遍历数组 $students = [‘小明’, ‘小红’, ‘小刚’]; foreach ($students as $student) { echo &quot…

    PHP 2023年5月26日
    00
  • 你应该知道PHP浮点数知识

    下面是“你应该知道PHP浮点数知识”的完整攻略: 什么是PHP浮点数? PHP浮点数是指带有小数部分的数值,如3.14,2.5等。浮点数用来表示实数,在计算机中以二进制形式存储。 PHP浮点数的精度问题 浮点数在计算机中以二进制形式存储,而计算机内部使用的二进制系统是有限的。这就意味着,浮点数在计算机内部的表示是有限的,精度存在限制。而浮点数的运算可能导致精…

    PHP 2023年5月24日
    00
  • php数组键值用法实例分析

    PHP数组键值用法实例分析 在PHP中,数组是一种非常常见的数据类型,数组中的每个元素都由一个键和一个值组成。在这个主题中,我们将深入探讨数组的键值用法,并提供一些实例来演示数组键值的使用方法。 数组键值的概述 数组中的键可以是整数或字符串类型。如果键是整数,那么它们将自动赋值为按顺序递增的整数。如果键是字符串,则键就是该字符串本身。数组中的值可以是任何类型…

    PHP 2023年5月26日
    00
  • php长字符串定义方法

    PHP中的长字符串定义方法可以使用多种方式来实现。在下面的文本中,我会详细说明不同的方法。 使用单引号 可以在单引号中定义一个长字符串,直到遇到下一个单引号为止。 $long_string = ‘这是一个非常长的字符串,可以在单引号中定义,一直到另一个单引号出现。’; 使用双引号 同样的,我们也可以在双引号中定义一个长字符串。与单引号类似,直到遇到下一个双引…

    PHP 2023年5月26日
    00
  • php文件上传原理与实现方法详解

    PHP文件上传原理与实现方法详解 一、文件上传原理 文件上传是指将客户端计算机上的文件上传到服务端的操作。实现文件上传主要需要涉及两个方面:前端与后端。 前端实现:通过HTML表单中的文件上传组件 input type=”file” 实现文件选择,表单数据通过POST请求提交到后端。 后端实现:通过PHP中的$_FILES数组获取文件上传的详细信息,如文件名…

    PHP 2023年5月26日
    00
  • 用ActivePHP打造版本管理系统

    使用ActivePHP打造版本管理系统,主要分为以下几个步骤: 1. 安装ActivePHP ActivePHP是一个基于PHP的后端框架,提供丰富的工具和组件,可以快速地搭建Web应用程序。安装ActivePHP的方式很简单,直接通过Composer进行安装即可: composer require activephp/activephp 2. 初始化项目 …

    PHP 2023年5月24日
    00
  • php取得字符串首字母的方法

    要取得字符串的首字母,可以使用PHP中的substr()函数结合字符串的索引进行操作。具体流程如下: 1.使用 substr() 函数获取到字符串的第一个字符。由于PHP中的字符串索引是从0开始的,所以要指定起始位置为0,长度为1。 2.使用 strtoupper() 函数将获取到的字母转换为大写,确保结果的一致性和可读性。 下面是示例代码: // 示例字符…

    PHP 2023年5月26日
    00
  • 微信小程序授权登录解决方案的代码实例(含未通过授权解决方案)

    微信小程序授权登录解决方案攻略 概述 微信小程序授权登录是指用户可以通过微信账号的方式快速登录小程序,授权登录可以让用户快速访问小程序中的某些功能,提升用户体验。接下来,将一步步为大家介绍微信小程序授权登录解决方案的代码实现过程。 控件准备 对于微信小程序的授权登录,需要用到微信提供的 button 和 open-type=getUserInfo 控件,其中…

    PHP 2023年5月30日
    00
合作推广
合作推广
分享本页
返回顶部