学习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技术站