php 原型模式
一,原型模式,就是先创建好一个原型对象,然后通过拷贝原型对象来生成新的对象。适用于大对象的创建,因为每次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;
-
-
/*输出
-
张三
-
张三
-
张三
-
---------------
-
李四
-
李四
-
张三
-
---------------
-
小琴
-
王五
-
王五
-
---------------*/
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgfbkia
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01