原型模式主要用于创建重复的对象;目的是使用 clone 对象来减少 new 对象的开销;如果某个场景需要多次实例化一个类;那就可以尝试用原型模式优化;在 php 中使用原型模式是很简单的;只需要 clone 就行了;但是 clone 有一些问题;
浅克隆的 是同一个引用,一个改变,另一个也跟着改变。
深克隆之间不再是同一个引用;一个改变,另一个不会跟着改变。
class Car
{
/**
* 车名
*
* @var
*/
public $name;
/**
* 设置车名
*
* @param $name
*/
public function setName($name)
{
$this->name = $name;
}
}
/**
* 浅克隆
*/
class ShallowDrive
{
private $car;
/**
* Drive constructor.
*/
public function __construct()
{
echo '准备完成';
}
/**
* 选择要开的车
*
* @param $car
*/
public function setCar($car)
{
$this->car = $car;
}
public function show()
{
echo '开始驾驶'.$this->car->name;
echo '<br>';
}
}
//深克隆
class DeepDrive
{
private $car;
/**
* Drive constructor.
*/
public function __construct()
{
echo '准备完成';
}
/**
* 选择要开的车
*
* @param $car
*/
public function setCar($car)
{
$this->car = $car;
}
public function show()
{
echo '开始驾驶'.$this->car->name;
echo '<br>';
}
public function __clone()
{
$this->car = clone $this->car;
}
}
class Client
{
/**
* 浅克隆
*/
public function shallowCopy()
{
$car = new Car();
$car->name = '特斯拉';
$shallowDrive = new ShallowDrive();
$shallowDrive->setCar($car);
$shallowDrive->show();
$cloneDrive = clone $shallowDrive;
$cloneDrive->show();
echo '<hr>';
$car->name = '凯迪拉克';
$shallowDrive->show();
$cloneDrive->show();
}
/**
* 深克隆
*/
public function deepCopy()
{
$car = new Car();
$car->name = '特斯拉';
$deepDrive = new DeepDrive();
$deepDrive->setCar($car);
$deepDrive->show();
$cloneDrive = clone $deepDrive;
$cloneDrive->show();
echo '<hr>';
$car->name = '凯迪拉克';
$deepDrive->show();
$cloneDrive->show();
}
}
$client = new Client();
$client->shallowCopy();
echo '<br>-----------------------------<br>';
$client->deepCopy();