原理:https://blog.csdn.net/xingjiarong/article/details/50047443
示例:https://www.cnblogs.com/ddddemo/p/5623213.html
原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。简单的说,就是克隆一个对象。适用于大对象的创建,因为创建一个大对象需要很大的开销,如果每次new就会消耗很大,原型模式仅需内存拷贝即可
克隆对象分为两种,一种是简单复制,另一种是深度复制。
简单复制:即直接用clone函数复制一个对象,但这个方法只会复制简单类型的数据,复杂类型的数据仍然是引用。
深度复制:将对象序列化后再反序列化回来。使用serialize(),unserialize()这两个函数
具体实现就是在原型类中添加一个克隆自身的方法。
<?php
interface Prototype
{
public function shallowCopy();
public function deepCopy();
}
class ConcretePrototype implements Prototype
{
private $_name;
public function __construct($name)
{
$this->_name = $name;
}
public function setName($name)
{
$this->_name = $name;
}
public function getName()
{
return $this->_name;
}
/**
* 浅拷贝
* */
public function shallowCopy()
{
return clone $this;
}
/**
* 深拷贝
* */
public function deepCopy()
{
$serialize_obj = serialize($this);
$clone_obj = unserialize($serialize_obj);
return $clone_obj;
}
}
class Demo
{
public $string;
}
class UsePrototype
{
public function shallow()
{
$demo = new Demo();
$demo->string = "susan";
$object_shallow_first = new ConcretePrototype($demo);
$object_shallow_second = $object_shallow_first->shallowCopy();
var_dump($object_shallow_first->getName());
echo "\n\n";
var_dump($object_shallow_second->getName());
echo "\n\n";
$demo->string = "sacha";
var_dump($object_shallow_first->getName());
echo "\n\n";
var_dump($object_shallow_second->getName());
echo "\n\n";
}
public function deep()
{
$demo = new Demo();
$demo->string = "Siri";
$object_deep_first = new ConcretePrototype($demo);
$object_deep_second = $object_deep_first->deepCopy();
var_dump($object_deep_first-> ());
echo "\n\n";
var_dump($object_deep_second->getName());
echo "\n\n";
$demo->string = "Demo";
var_dump($object_deep_first->getName());
echo "\n\n";
var_dump($object_deep_second->getName());
echo "\n\n";
}
}
$up = new UsePrototype();
// $up->shallow();
echo "\n\n";
$up->deep();