学习php设计模式 php实现原型模式(prototype)

yizhihongxing

学习PHP设计模式:PHP实现原型模式(Prototype)

概述

原型模式是一种创建型设计模式,它允许对象通过克隆来创建。这个模式可以被用来使对象的创建更加高效,因为对象的克隆要比新建对象更加快速。

示例

我们假设有一个用户类,其中包含了用户的姓名、电子邮件和密码。我们可以使用原型模式创建一个用户,然后通过在需要时复制此原型来创建新用户对象。

class User
{
    public $name;
    public $email;
    public $password;

    public function __construct($name, $email, $password)
    {
        $this->name = $name;
        $this->email = $email;
        $this->password = $password;
    }

    public function __clone()
    {
        $this->name .= ' (cloned)';
    }
}

在这个示例中,我们定义了一个User类,并在其中添加了一个__clone()方法,当对象被克隆时,该方法会被调用。在本例中,我们将克隆对象的name属性添加“(cloned)”后缀。

现在我们可以通过对原型对象调用PHP的clone关键字来创建新对象。

$userPrototype = new User('John Doe', 'john.doe@example.com', 's3cr3tp@ssw0rd');

$user1 = clone $userPrototype;
echo $user1->name; // 'John Doe (cloned)'

$user2 = clone $userPrototype;
echo $user2->name; // 'John Doe (cloned)'

在上面的示例中,我们使用原型模式创建了两个User对象,通过对$userPrototype对象调用clone来复制对象属性,然后再创建两个新的对象$user1和$user2。

另一个示例

下面是一个更复杂的示例,其中我们使用PHP原型模式创建了一个披萨(Pizza)对象。除了名称(name)和价格(price)以外,披萨对象还有一组配料(toppings)。

class PizzaPrototype
{
    private $name;
    private $price;
    private $toppings = [];

    public function __construct($name, $price, $toppings)
    {
        $this->name = $name;
        $this->price = $price;
        $this->toppings = $toppings;
    }

    public function __clone()
    {
        $this->name .= ' (cloned)';
        $this->toppings = array_map(function($topping) {
            return clone $topping;
        }, $this->toppings);
    }

    public function addTopping($topping)
    {
        $this->toppings[] = $topping;
    }

    public function getName()
    {
        return $this->name;
    }

    public function getPrice()
    {
        return $this->price;
    }

    public function getToppings()
    {
        return $this->toppings;
    }
}

class PizzaToppingPrototype
{
    private $name;

    public function __construct($name)
    {
        $this->name = $name;
    }

    public function getName()
    {
        return $this->name;
    }

    public function __clone()
    {
        $this->name .= ' (cloned)';
    }
}

在上面的示例中,我们定义了两个类:PizzaPrototype和PizzaToppingPrototype。PizzaPrototype类表示一种披萨,它包含名称(name)、价格(price)和配料(toppings)。我们还定义了一个PizzaToppingPrototype类,它表示披萨的一种配料。

当我们将PizzaPrototype实例对象克隆时,__clone()方法会被调用。在__clone()中,我们将name属性添加“(cloned)”后缀并进行递归克隆配料的实例对象。

下面是我们使用PizzaPrototype类的代码:

$topping1 = new PizzaToppingPrototype('Mushrooms');
$topping2 = new PizzaToppingPrototype('Pepperoni');
$topping3 = new PizzaToppingPrototype('Olives');
$topping4 = new PizzaToppingPrototype('Onions');

$pizzaPrototype = new PizzaPrototype('Margherita', 10.99, [$topping1, $topping3]);
$pizzaPrototype->addTopping($topping2);

$pizza1 = clone $pizzaPrototype;
$pizza2 = clone $pizzaPrototype;

$pizza2->addTopping($topping4);

echo 'Pizza 1: ' . $pizza1->getName() . ' - $' . $pizza1->getPrice() . "\n";
foreach ($pizza1->getToppings() as $topping) {
    echo '  ' . $topping->getName() . "\n";
}

echo 'Pizza 2: ' . $pizza2->getName() . ' - $' . $pizza2->getPrice() . "\n";
foreach ($pizza2->getToppings() as $topping) {
    echo '  ' . $topping->getName() . "\n";
}

在这个示例中,我们首先创建几个PizzaToppingPrototype的实例对象作为配料,然后使用它们创建一个PizzaPrototype实例对象。我们克隆$pizzaPrototype二次来创建$pizza1和$pizza2变量,第二个$pizza2上添加了一个新的配料(topping4)。

最后,我们遍历$pizza1和$pizza2的配料并输出。

结论

原型模式是一种非常有用的设计模式,它可以使对象的复制工作更加高效和简便。在PHP中实现原型模式很容易,只需要在类上定义一个__clone()方法即可。在创建对象时,我们可以使用PHP的clone关键字并复制对象的属性。我们在上面的示例中展示了如何使用PHP实现原型模式,并且证明了这一点非常有用和方便。

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

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

相关文章

  • 微信小程序(订阅消息)功能

    下面是微信小程序订阅消息的完整攻略: 1. 申请订阅消息权限 首先需要在小程序后台申请订阅消息权限。具体步骤如下: 进入小程序后台,点击“开发”->“接口设置”->“订阅消息”。 点击“添加模板”,选择需要订阅的消息模板,填写模板所需的参数信息。 提交审核,等待微信官方审核通过。 2. 前端实现 在前端页面需要先引入wx.requestSubsc…

    PHP 2023年5月23日
    00
  • PHP之浮点数计算比较以及取整数不准确的解决办法

    PHP之浮点数计算比较以及取整数不准确的解决办法 在PHP浮点数计算比较以及取整数时,经常会遇到计算精度不准确的问题,这是由于浮点数的储存方式以及二进制计算中存在的精度问题导致的。本次攻略将为大家介绍如何在PHP中处理浮点数计算精度问题。 1. 浮点数比较 在PHP中,浮点数比较不能直接使用“==”或“!=”运算符,若要对浮点数进行比较,应该使用“>”…

    PHP 2023年5月26日
    00
  • 使用php方法curl抓取AJAX异步内容思路分析及代码分享

    使用php方法curl抓取AJAX异步内容的完整攻略包括以下几个步骤: 分析目标网站的AJAX请求 首先需要打开目标网站的开发者工具,查看目标网站在加载时会发起哪些AJAX请求。然后找到对应的AJAX请求,记录下请求的URL和参数,以便后续使用。 使用PHP的curl函数库进行请求 使用PHP的curl函数库,可以方便地向目标URL发送请求,并且可以设置请求…

    PHP 2023年5月27日
    00
  • 小程序实现Token生成与验证

    小程序实现Token生成与验证攻略 在实现Token生成与验证之前,我们需要明确以下几个概念: 随机数:本质上就是一个不可预测的字符串,用于生成Token中的部分字符串。 时间戳:是一个整数型的时间值,表示从1970年1月1日至当前时间的秒数,用于给Token设置过期时间。 Token:是一段字符串,用于验证用户的身份和权限。 Token生成 在小程序中,我…

    PHP 2023年5月23日
    00
  • php数值计算num类简单操作示例

    PHP数值计算Num类是一个常用的数值运算工具类,它提供了一系列数值计算相关的方法,方便进行各种复杂的数值运算。本文将介绍Num类的使用方法,以及常用的数值运算示例。 Num类的使用方法 引入Num类 使用Num类之前必须先引入类文件,可以使用以下代码: require_once ‘Num.php’; 实例化Num类 $num = new Num(); 加法…

    PHP 2023年5月26日
    00
  • PDO::exec讲解

    PDO是PHP中用于访问数据库的一个扩展模块,其中的exec函数是用来执行一条SQL语句的函数。下方是PDO::exec的完整攻略。 什么是PDO::exec PDO::exec方法是用来执行一条SQL语句的函数。它返回值为受SQL语句影响的行数。 PDO::exec的语法 PDO::exec有以下语法: public int PDO::exec(strin…

    PHP 2023年5月26日
    00
  • php用户密码加密算法分析【Discuz加密算法】

    感谢您对我们网站的关注和关心。以下是“php用户密码加密算法分析【Discuz加密算法】”的完整攻略。 PHP用户密码加密算法分析 什么是用户密码加密? 用户密码加密是指对用户原始密码进行处理,生成新的密码字符串,以增强密码安全性。加密后的密码字符串一般应当不能被反向解密获得原始密码。 PHP用户密码加密常见算法 常见的PHP用户密码加密算法,有MD5、SH…

    PHP 2023年5月27日
    00
  • 第四章 php数学运算

    第四章 PHP数学运算完整攻略 1. 基本数学运算 PHP中的基本数学运算包括加减乘除、取余数、求幂等操作,这些操作都使用了常见的数学符号。例如:+是加号,-是减号,*是乘号,/是除号,%是取余符号,**是求幂符号。下面是这些操作的具体示例: // 加减乘除 $a = 10; $b = 5; $c = $a + $b; // 15 $c = $a – $b;…

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