一,原型模式,就是先创建好一个原型对象,然后通过拷贝原型对象来生成新的对象。适用于大对象的创建,因为每次new一个大对象会有很大的开销,原型模式仅需内存拷贝即可。 原型模式中的主要角色: 1,抽象原型(Prototype)角色:声明一
一,原型模式,就是先创建好一个原型对象,然后通过拷贝原型对象来生成新的对象。适用于大对象的创建,因为每次new一个大对象会有很大的开销,原型模式仅需内存拷贝即可。
原型模式中的主要角色:
1,抽象原型(Prototype)角色:声明一个克隆自身的接口。
2,具体原型(Concrete Prototype)角色:实现一个克隆自身的操作。
二,浅拷贝、深拷贝
浅拷贝:被拷贝对象的所有变量都含有与原对象相同的值,而且对其他对象的引用仍然是指向原来的对象。
即浅拷贝只负责当前对象实例,对引用的对象不做拷贝。深拷贝:被拷贝对象的所有的变量都含有与原来对象相同的值,除了那些引用其他对象的变量。那些引用其他对象的变量将指向一个被拷贝的新对象,而不再是原有那些被引用对象。
即深拷贝把要拷贝的对象所引用的对象也都拷贝了一次,而这种对被引用到的对象拷贝叫做间接拷贝。
三,例子
//抽象原型interface Prototype{ public function clone(); public function deepClone();}//具体原型class Concrete implements Prototype{ private $name; //浅拷贝 public function clone() { return clone $this; } //深拷贝 public function deepClone() { return unserialize(serialize($this)); } public function set($name) { $this->name = $name; } public function get() { if (is_object($this->name)){ echo $this->name->name.PHP_EOL; }else{ echo $this->name.PHP_EOL; } }}class Name{ public $name='张三';}//当被拷贝的对象有对象引用的时候$obj = new Concrete();$objName=new Name();$obj->set($objName);$objClone = $obj->clone();$objDeepClone = $obj->deepClone();$obj->get();$objClone->get();$objDeepClone->get();echo '---------------'.PHP_EOL;$objName->name='李四';$obj->get();$objClone->get();$objDeepClone->get();echo '---------------'.PHP_EOL;//当被拷贝的对象只有属性变量$obj->set('王五');$objClone = $obj->clone();$objDeepClone = $obj->deepClone();$obj->set('小琴');$obj->get();$objClone->get();$objDeepClone->get();echo '---------------'.PHP_EOL;
来源地址:https://blog.csdn.net/zhouchang111/article/details/131983543
--结束END--
本文标题: php 原型模式
本文链接: https://www.lsjlt.com/news/389373.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0