说明
原型模式也是创建型的设计模式,先创建好一个原型对象,然后对他进行拷贝来创建新的对象,这样就免去了类创建是重复初始化操作。原型模式适用于对大对象的创建,大对象每次new
消耗很大,原型模式仅需内存拷贝即可
示例
<?php /** * Created by 憧憬. * User: longshilin * Date: 2020-01-23 * Time: 22:00 */ class Names { } class User { public $name; public function __construct() { $this->name = new Names(); } public function setName($name) { $this->name->nickname = $name; } /** * 直接在这个魔术方法也指定需要再次克隆的对象 可以解决这个 * @author: 憧憬 */ public function __clone() { $this->name = clone $this->name; } } // 本身php就支持克隆 clone $user = new User(); $newUser = clone $user; $user->setName('憧憬'); print_r($user->name); print_r($newUser->name); echo PHP_EOL; // 但是clone操作是一个浅拷贝 我们name这个成员属性是一个对象 当我们去修改这个对象里面属性的时候 克隆的对象也能获取到同一个数据 // 所以我们需要考虑到深拷贝 可以直接添加__clone来解决 还可以利用反序列化 $hUser = new User(); $wUser = unserialize(serialize($hUser)); $hUser->setName('憧憬'); print_r($hUser->name); print_r($wUser->name); // 以上也是可行的
- 深拷贝
被拷贝对象的所有变量都含有原对象的值,除了那些引用其他对象的变量, 那些引用其他对象的变量将指向一个被拷贝的新对象,而不再是原来那些引用的对象。即深拷贝把要拷贝的对象所引用的对象也拷贝了一次。而这种对被引用到的对象拷贝叫做间接拷贝。
在决定以深拷贝的方式拷贝一个对象的时候,必须决定对间接拷贝的对象时采取浅拷贝还是深拷贝还是继续采用深拷贝。
- 序列化深拷贝
利用序列化来做深拷贝,把对象写到流里的过程是序列化的过程,这一过程称为“冷冻”,反序列化对象的过程叫做“解冻”。可以达到深拷贝的效果
- 浅拷贝
被拷贝对象的所有变量都含有与原对象相同的值,而且与其他对象的引用仍然指向原来的对象,即浅拷贝只负责当前对象实例,对引用对象不做拷贝