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

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)
上一篇 4天前
下一篇 4天前

相关文章

  • 比较好用的PHP防注入漏洞过滤函数代码

    请您详细阅读以下攻略,完整讲解“比较好用的PHP防注入漏洞过滤函数代码”的过程。 什么是SQL注入漏洞? SQL注入是一种常见的网络攻击技术,通过在Web应用程序的输入框或URL中注入恶意的SQL语句,来获取或损坏应用程序中的敏感信息。SQL注入漏洞的出现,往往是因为Web应用程序的输入校验不够严格或者过滤不到位。 如何防范SQL注入漏洞? 防范SQL注入漏…

    PHP 1天前
    00
  • 微信小程序开发(二)图片上传+服务端接收详解

    我来为您详细讲解“微信小程序开发(二)图片上传+服务端接收详解”的完整攻略。 文章概述 本文主要介绍微信小程序中图片上传的方法,以及服务端接收图片的实现方法。主要包括以下内容: 小程序中基于wx.chooseImage()实现图片上传 服务端使用Node.js and express框架来接收图片并保存 小程序中基于wx.chooseImage()实现图片上…

    PHP 2023年5月23日
    00
  • php遍历目录输出目录及其下的所有文件示例

    PHP遍历目录输出目录及其下的所有文件 1. 准备目录结构 在开始之前,需要准备一个目录结构,用于测试遍历目录的功能。假设在网站的根目录下准备一个名为 test 的目录,并在该目录下分别创建两个子目录 folder1 和 folder2,并在这两个子目录下分别各创建一个文件。目录结构如下: test/ |– folder1/ | |– file1.txt…

    PHP 5天前
    00
  • 微信小程序环境下将文件上传到OSS的方法步骤

    要将文件上传到OSS,需要经过以下步骤: 步骤1:安装依赖 在小程序项目的根目录下,使用npm安装ali-oss和aliyun-sdk: npm install ali-oss aliyun-sdk –save 步骤2:在OSS中创建Bucket和AccessKey 在OSS中创建一个Bucket,并获取AccessKey ID和AccessKey Sec…

    PHP 1天前
    00
  • PHP语法速查表

    下面是“PHP语法速查表”的完整攻略。 简介 “PHP语法速查表”是一个简洁明了的PHP语法速查表,它可以帮助PHP开发者快速查找各种常用语法及特性。 页面结构 “PHP语法速查表”页面由三个部分组成: 页头 页头包括一个标题及一张图片(可选),通常用于展示网站的名称及 logo 等信息。 <!DOCTYPE html> <html>…

    PHP 2023年5月24日
    00
  • token验证

    token验证 什么是token?我相信很多开发者都或多或少听过基于 token 的用户鉴权和基于 session 的用户鉴权,而今天说的 token 验证就是第一种了。token 的意思是“令牌”,是用户第一次登录服务器返回的,它能让用户不需要提交账户和密码就能进行服务器验证身份,它是被放在请求头中一起提交给服务器的。 为什么用 token 验证?怎么用 …

    PHP 2023年4月17日
    00
  • php模拟js函数unescape的函数代码

    下面我将为您提供一份详细的攻略,讲解如何用PHP模拟JS函数unescape的函数代码,并且提供两个示例说明。 1. 了解unescape函数 在开始编写PHP模拟unescape函数代码之前,我们需要先了解一下unescape函数是什么。unescape是JavaScript中的解码函数,用于将经过escape编码的字符串进行解码。 例如,在JavaScr…

    PHP 6天前
    00
  • php生成zip压缩文件的方法详解

    PHP生成Zip压缩文件的方法详解 生成Zip压缩文件是常见的文件操作之一,本文将介绍如何使用PHP来生成Zip压缩文件,包括如何添加文件、添加目录、压缩文件密码等功能。 1. 下载ZipArchive类 在PHP中,我们可以使用ZipArchive类来处理Zip压缩文件,因此需要先下载并引入ZipArchive类。 <?php $zip = new …

    PHP 5天前
    00
  • PHP加密解密字符串汇总

    下面是详细讲解“PHP加密解密字符串汇总”的完整攻略,分以下几部分展开: 1. 简介 首先,为什么需要加密解密字符串呢?因为在网络传输或其他场景下,敏感信息经常需要加密以确保安全性。而PHP是一种常用的服务器端编程语言,它提供了多种加密解密方式供开发者使用。 本文将详细介绍常见的几种PHP加密解密方式及使用方法。 2. 加密解密方式 2.1. base64加…

    PHP 5天前
    00
  • PHP实现链式操作的三种方法详解

    PHP实现链式操作的三种方法详解 在PHP中,使用链式操作可以让代码看起来更加简洁,易于维护。针对于链式操作,本文将介绍三种实现方法,分别是使用普通函数、使用魔术方法和使用静态方法。 方法一:使用普通函数 使用普通函数实现链式操作,就是在每个函数的末尾都返回对象本身,这样就可以实现链式调用。 示例1: class Chain{ private $var; p…

    PHP 2023年5月23日
    00