概念理解:原型模式是先创建好一个原型对象,然后通过clone原型对象来创建新的对象。适用于大对象的创建,因为创建一个大对象需要很大的开销,如果每次new就会消耗很大,原型模式仅需内存拷贝即可
主要角色:
Prototype(抽象原型角色):声明一个克隆自身的接口
Concrete Prototype(具体原型角色):实现一个克隆自身的操作
上代码
<?php
//原型模式
interface Prototype{
//定义浅拷贝方法
public function shallowCopy();
//定义深拷贝方法
public function deepCopy();
}
class ConcretePrototype implements Prototype{
//定义小狗的名字
private $dog;
public function __construct($name){
$this->dog = $name;
}
//设置小狗的名字
public function setName($name){
$this->dog = $name;
}
public function getName(){
return $this->dog;
}
/**
* 浅拷贝
* */
public function shallowCopy(){
return clone $this;
}
/**
* 深拷贝
* */
public function deepCopy(){
return unserialize(serialize($this));
}
}
class Demo{
public $string;
}
class UsePrototype{
public function shallow(){
$demo = new Demo();
//设置demo对象的属性
$demo->string = "哈士奇";
//把对象传入到原型中
$first = new ConcretePrototype($demo);
//获得原型浅拷贝的对象
$shallow = $first->shallowCopy();
//输出原型对象属性
var_dump($first->getName());
echo '<br/>';
//输出原型浅拷贝后的对象属性
var_dump($shallow->getName());
echo '<br/>';
//更改demo对象的属性
$demo->string = "柯基";
//更改Demo对象属性后对原型类对象的影响
var_dump($first->getName());
echo '<br/>';
//更改Demo对象属性后对原型浅拷贝后的对象的影响
var_dump($shallow->getName());
echo '<br/>';
}
public function deep(){
$demo = new Demo();
//设置demo对象的属性
$demo->string = "金毛";
//把对象传入到原型中
$first = new ConcretePrototype($demo);
//获得原型深拷贝的对象
$deep = $first->deepCopy();
//输出原型的属性
var_dump($first->getName());
echo '<br/>';
//输出原型深拷贝后的对象属性
var_dump($deep->getName());
echo '<br/>';
$demo->string = "柴犬";
//更改Demo对象属性后对原型类对象的影响
var_dump($first->getName());
echo '<br/>';
//更改Demo对象属性后对原型深拷贝后的对象的影响
var_dump($deep->getName());
echo '<br/>';
}
}
//执行代码
$up = new UsePrototype;
$up->shallow();
echo '<hr>';
$up->deep();
看效果
image.png
说一下深拷贝和浅拷贝通俗理解
深拷贝:赋值时值完全复制,完全的copy,对其中一个作出改变,不会影响另一个
浅拷贝:赋值时,引用赋值,相当于取了一个别名。对其中一个修改,会影响另一个