学习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)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • PHP实现数据四舍五入的方法小结【4种方法】

    PHP实现数据四舍五入的方法小结【4种方法】 对于一些需要精确计算的应用场景,我们需要对数据进行四舍五入的操作,本文总结了4种PHP实现数据四舍五入的方法。 方法一:round函数 round函数是PHP自带的函数,可以对一个数进行四舍五入。此函数接受两个参数,第一个参数是需要进行四舍五入的数值,第二个参数是小数点后保留的位数。如果第二个参数未传值,则默认返…

    PHP 2023年5月26日
    00
  • PHP实现简单数字分页效果

    下面我将为您详细讲解“PHP实现简单数字分页效果”的完整攻略,主要包括以下几个方面的内容: 理解数字分页的基本思路 编写实现数字分页的PHP代码 示例说明及代码解析 1. 理解数字分页的基本思路 数字分页指的是在数据较多的情况下,将数据按固定的条数分成若干页,同时在页面上显示相应的分页链接,从而实现快速翻页查看数据的功能。常见的实现方式有两种:基于URL传参…

    PHP 2023年5月27日
    00
  • SQL注入宽字节注入由浅到深学习

    下面是“SQL注入宽字节注入由浅到深学习”的完整使用攻略,包括攻击方式、防御措施和两个示例说明。 SQL注入和宽字节注入 SQL注入和宽字节注入是常见的网络攻击方式,攻击者可以通过这些方式获取敏感信息或者破坏系统。 SQL注入 SQL注入是一种利用Web应用程序的漏洞,向其中插入恶意SQL语句的攻击方式。攻击者可以通过SQL注入获取敏感信息,修改数据或者破坏…

    PHP 2023年5月12日
    00
  • PHP中执行cmd命令的方法

    在PHP中执行cmd命令通常有三种方法: 方法一:使用exec函数 exec函数可以以阻塞模式执行cmd命令,并将最后一行输出作为结果返回。如果需要获取所有输出信息,可以使用第二个参数。注意,这种方法存在安全风险,因为cmd命令可以在PHP运行的操作系统上执行任意命令。 示例一: <?php $output = array(); exec(‘dir’,…

    PHP 2023年5月23日
    00
  • PHP使用递归算法无限遍历数组示例

    下面是详细的攻略: 算法介绍 首先我们需要了解什么是递归算法。递归算法简单来说就是一个函数调用自身的过程。在处理树形结构或者其他具有自相似性质的问题时,可以用递归算法进行处理。 在本例中,我们将展示如何使用递归算法无限遍历数组,递归中需要做的事情主要是对数组中每个元素进行判断,如果该元素依然是数组,则需要进行下一次递归。 代码示例 下面是PHP使用递归算法无…

    PHP 2023年5月26日
    00
  • 详解PHP中数组函数的巧用

    详解PHP中数组函数的巧用 PHP作为一门脚本语言,常常需要处理大量的数据,而数组作为一种常见的数据结构,其所涉及的操作也非常多。在这里,我们将介绍PHP中一些常用的数组函数,以及它们的一些巧用方法,希望对PHP开发者的工作有所帮助。 implode() / explode() 在处理字符串时,经常会遇到将一串字符串分割成多个子串的情况,或者将多个子串拼接成…

    PHP 2023年5月26日
    00
  • 批量下载对路网图片并生成html的实现方法

    我来为你详细讲解“批量下载对路网图片并生成html的实现方法”的完整攻略。 实现方法 确定目标图片网站 首先需要确定目标图片网站,找到需要下载的图片所在的页面 找到图片标签 在目标网站页面中,需要找到所有图片元素所对应的标签,通常是<img>标签 提取图片链接 提取每个图片标签中的src属性即可得到图片下载链接 下载图片 用python程序对获取…

    PHP 2023年5月27日
    00
  • 基于静态Singleton模式的使用介绍

    我来为你讲解“基于静态 Singleton 模式的使用介绍”的完整攻略。 什么是 Singleton 模式 Singleton 模式是一种创建型模式,其指的是一个类仅有一个实例,并且提供访问该实例的全局访问点。Singleton 模式通常用来控制服务线程池、计数器或者共享打印机等需要在整个程序中只有一个实例的情况。 静态 Singleton 模式 静态 Si…

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