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

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

相关文章

  • php简单浏览目录内容的实现代码

    要实现PHP简单浏览目录内容的代码,主要需要以下几个步骤: 使用opendir()函数打开目录:opendir()函数的作用是打开目录,返回一个资源类型的值,供后续操作使用。 示例代码: $dir = "./test"; // 被浏览的目录 $handle = opendir($dir); // 打开目录 读取目录中的内容:使用readd…

    PHP 2023年5月23日
    00
  • php中用foreach来操作数组的代码

    当我们需要循环操作数组时,在php中使用foreach是非常方便和常用的方式。下面是使用foreach来操作数组的完整攻略: 1. foreach语法介绍 foreach语法如下: foreach (数组 as $key => $value) { //执行代码 } 其中,“数组”是需要循环操作的数组变量,它可以是一个数组,也可以是一个通过函数或方法返回…

    PHP 2023年5月26日
    00
  • 微信小程序getPhoneNumber获取用户手机号

    下面我将详细讲解“微信小程序getPhoneNumber获取用户手机号”的完整攻略。 1. 获取用户手机号的前提条件 在使用getPhoneNumber获取用户手机号之前,必须满足以下条件: 该用户已经授权过小程序获取用户手机号; 开启了“获取用户手机号”权限; 正在使用微信运行的环境; 用户允许小程序使用手机号码。 2. 如何获取用户手机号 获取用户手机号…

    PHP 2023年5月30日
    00
  • 谷歌 Chrome 浏览器 109 正式版发布 最后支持Win7/8.1的版本

    谷歌 Chrome 浏览器 109 正式版发布 最后支持Win7/8.1的版本 背景介绍 谷歌 Chrome 浏览器是世界上最受欢迎的浏览器之一,它在功能、安全、速度等方面都具有先进的优势。在2022年3月发布的第109个版本中,谷歌宣布这将是最后一个支持Windows 7/Windows 8.1操作系统的版本。Windows 7/Windows 8.1的用…

    PHP 2023年5月26日
    00
  • 微信小程序canvas写字板效果及实例

    微信小程序canvas写字板效果及实例 概述 在微信小程序中,使用canvas可以实现很多有趣的效果,如播放动画、绘制图形等等。其中,canvas写字板效果可以让用户在小程序中手写文字,增加用户体验和交互性。在本教程中,我们将详细讲解如何使用canvas实现写字板效果,并提供两个示例说明。 步骤 第一步:创建画布 在小程序页面中添加canvas标签,并设置宽…

    PHP 2023年5月23日
    00
  • 文档格式转换大全:怎么把word文档转成pdf,wps文档转换成word

    文档格式转换是一个常见的需求,主要是因为不同的文档格式在不同的场景下有不同的优势。例如,PDF文档可以保持原始格式不变并且不易被篡改,而Word文档则可以轻松地进行编辑和修改。本文将介绍一些常见的文档格式转换方法。 一、Word文档转PDF 1.使用Office 365 Office 365是微软公司提供的一款在线办公套件,它可以免费提供Word文档转PDF…

    PHP 2023年5月26日
    00
  • PHP设计模式之工厂模式实例总结

    PHP设计模式之工厂模式实例总结 什么是工厂模式? 工厂模式是面向对象设计中的一种常用模式,它的主要思想是将对象的实例化过程封装起来,使得创建对象的过程可以独立于具体的类和方法,从而实现代码的解耦复用。 在工厂模式中,我们通过一个工厂类来创建对象,这样就可以通过工厂类的统一接口来创建对象,而不必关心具体实现细节。 工厂模式的基本结构 在工厂模式中,一般会涉及…

    PHP 2023年5月27日
    00
  • 疯狂猜成语 两个心的答案是什么

    下面是针对“疯狂猜成语”中“两个心”的答案攻略: 答案解析 “两个心”的答案是“心心相印”。 答题思路 分析提示词汇,找到关键词“两个心”。 思考与“两个心”相关的成语。 构思成语接龙,注意词性和语法。 验证答案是否符合提示。 示例一 提示: 一口气猜中3个成语,这就是天赋异禀! A. 红日初升 B. 纸上谈兵 C. 两个心 思路及解析: 从A、B的成语接龙…

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