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

相关文章

  • 微信小程序如何添加使用? 微信小程序添加使用方法详情介绍

    微信小程序如何添加使用?——微信小程序添加使用方法详解 微信小程序是微信生态圈中的一种应用程序,它具有轻便、便捷、快速等特点,可以在不下载安装的情况下直接使用。下面是添加和使用微信小程序的详细步骤: 1. 如何添加微信小程序 步骤一:打开微信并进入”发现“页面 在微信的底部导航栏中找到”发现“并点击进入。 步骤二:进入”小程序“页面 在”发现“页面中,点击顶…

    PHP 2023年5月23日
    00
  • Shell脚本实现启动PHP内置FastCGI Server

    下面就详细讲解一下“Shell脚本实现启动PHP内置FastCGI Server”的完整攻略。 背景说明 FastCGI是一种通信协议,它可以将外部Web服务器和内部的Web应用服务器分离开来,以便让外部服务器可以控制多个内部Web服务器。PHP内置有FastCGI Server,通过启动PHP内置的FastCGI Server,可以搭建一个高性能的PHP网…

    PHP 2023年5月27日
    00
  • php中怎么搜索相关联数组键值及获取之

    在PHP中,可以使用array_keys()和array_values()函数分别获取数组的键和值,然后使用array_search()函数查找特定的键或值在数组中的位置。以下是具体的步骤: 第一步:创建一个关联数组 首先,我们需要创建一个关联数组,作为实验对象,以便演示如何搜索相关联数组的键值。例如: $students = array( "Jo…

    PHP 2023年5月26日
    00
  • 微信小程序应用怎么分享?微信小程序分享给朋友的教程

    关于微信小程序的分享,我们可以通过两种方式实现: 方式一:设置页面的分享配置 如果我们想要在小程序内分享页面给朋友,我们可以设置页面的分享配置。具体步骤如下: 在小程序的 app.json 文件中的 pages 数组中,增加我们要设置分享的页面路径; 在小程序的页面 JS 文件中,增加 onShareAppMessage 函数,该函数返回一个对象,里面设置分…

    PHP 2023年5月23日
    00
  • PHP单元测试框架PHPUnit用法详解

    PHP单元测试框架PHPUnit用法详解 PHPUnit是PHP中最流行的单元测试框架之一,它提供了一种简单而高效的方式来测试代码的正确性。在本文中,我们将介绍PHPUnit的使用方法,包括安装、编写和运行测试用例,并提供两个示例来帮助读者更好地理解。 安装PHPUnit PHPUnit可以通过Composer来安装,使用以下命令: composer req…

    PHP 2023年5月23日
    00
  • PHP代码加密的方法总结

    PHP代码加密的方法总结 PHP代码加密可以将源代码加密成一段难以理解的代码,从而保护代码不被盗用或者修改。下面总结了几种PHP代码加密的方法。 1. Zend Guard Zend Guard是Zend公司推出的一个PHP代码加密器。它可以将PHP源代码编译成Zend Optimizer可执行的格式,使攻击者无法读取和修改源代码。使用Zend Guard加…

    PHP 2023年5月24日
    00
  • php实现事件监听与触发的方法

    实现事件监听与触发的方法其实可以通过使用观察者模式来完成。观察者模式是一种对象行为模式,使得一个对象能够将自己的状态变化通知其他对象。在该模式中,对象间是松耦合的,即被观察的对象并不知道观察者的细节,观察者也不知道被观察的对象的细节。下面就来详细讲解如何使用PHP来实现事件监听与触发。 确定需求和流程 在实现之前,要先明确自己的实现需求和大致流程。在本例中,…

    PHP 2023年5月27日
    00
  • 使用 libevent 和 libev 提高网络应用性能的方法

    使用 libevent 和 libev 是提高网络应用性能的常见方法之一,下面将详细讲解使用这两个库提高网络应用性能的完整攻略。 1. libevent 和 libev 简介 libevent 是一个可移植的事件通知库,用于实现事件驱动的程序。 libev 是一个可移植的高性能事件驱动库,与 libevent 类似,但设计更为简单,效率更高。 2. 使用 l…

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