学习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日

相关文章

  • php基于 swoole 实现的异步处理任务功能示例

    下面是 “php基于 swoole 实现的异步处理任务功能示例” 的完整攻略: Swoole Swoole 是一个基于 PHP 的异步、协程网络通信引擎,被广泛用于构建高性能、高可靠的网络应用程序。通过 Swoole,我们可以像编写同步代码一样编写异步代码,在同时处理多个客户端请求时提供出色的性能。 PHP异步任务处理 PHP 基于 Swoole 提供了一种…

    PHP 2023年5月23日
    00
  • JS实现AES加密并与PHP互通的方法分析

    JS实现AES加密并与PHP互通的方法分析 1. 什么是AES加密算法 AES是高级加密标准(Advanced Encryption Standard)的缩写,它是一种对称加密算法,是目前应用最广泛的对称加密算法之一。AES加密算法具有安全、高效、灵活,可扩展性好等优点,被用于保护数据的安全性,比如在网络传输、文件存储等场景中。 2. JS如何实现AES加密…

    PHP 2023年5月26日
    00
  • php截取中文字符串函数实例

    PHP截取中文字符串函数实例 在PHP中,截取中文字符串与截取英文字符串不同,因为中文占用的字节数不同,所以我们需要针对中文字符进行截取。下面是一些可用的方法。 方法一:substr和mb_substr函数 substr和mb_substr函数都可以用于截取字符串,但是substr函数对于截取含有中文字符的字符串经常会出现乱码问题,而mb_substr函数在…

    PHP 2023年5月26日
    00
  • PHP htmlspecialchars()函数用法与实例讲解

    PHP htmlspecialchars()函数用法与实例讲解 简介 htmlspecialchars() 函数用于将特殊字符转换为 HTML 实体,防止被浏览器解释为 HTML 代码执行,从而避免安全问题。该函数常用于处理表单提交数据、输出内容到 HTML 页面等场景。 htmlspecialchars() 函数的语法如下: htmlspecialchar…

    PHP 2023年5月26日
    00
  • PHP实现对二维数组某个键排序的方法

    下面是PHP实现对二维数组某个键排序的方法的完整攻略: 1. 使用array_multisort函数 首先介绍一种非常简单的方法,即使用PHP内置的array_multisort函数。该函数可以对多个数组或多维数组进行排序。具体步骤如下: 假设有如下二维数组: $arr = array( array(‘name’ => ‘Tom’, ‘age’ =&g…

    PHP 2023年5月26日
    00
  • PHP安全技术之 实现php基本安全

    实现PHP基本安全主要包括以下几个方面: 一、文件目录安全 确保文件权限安全:web服务器必须拥有读取和执行文件的权限,而其他人所拥有的权限最好不能超过只读,不应该写或执行等敏感操作。将文件权限设置为644或755即可。为了提高安全性,应尽可能将敏感文件(如配置文件、日志文件等)放在非web目录下。 确保目录安全:为了防止用户通过URL访问到敏感的目录,可以…

    PHP 2023年5月27日
    00
  • PHP 中的类

    为了讲解PHP中的类,我将按照以下结构进行说明: 类的基本概念 声明类(class) 类属性和方法 类的继承 示例说明 其他 1. 类的基本概念 在PHP中,类是对象的模板。它定义了一个对象将包含哪些属性和方法。类可以看作是一种数据结构,其中定义了对象的属性和行为。通过类,可以实例化新的对象,从而控制其行为。 例如,你可以创建一个产品类,其中定义了产品的价格…

    PHP 2023年5月30日
    00
  • PHP实现网页内容html标签补全和过滤的方法小结【2种方法】

    当我们开发一个网站时,为了保证网站的安全性和用户的体验,在用户输入内容的时候需要进行标签过滤,以防止用户输入恶意代码或者不规范的html标签。同时,我们也需要对用户输入的内容进行补全,以保证网站呈现的内容的完整性和规范性。本文将介绍两种使用PHP实现网页内容html标签补全和过滤的方法。 第一种方法:使用PHP内置函数过滤标签 PHP提供了strip_tag…

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