设计模式-原型模式
来源:互联网 发布:算法设计与分析吕国英 编辑:程序博客网 时间:2024/06/05 05:59
原型模式
通过复制已经存在的对象来创建新对象
有的时候创建一个对象有很多步骤才算是完成一个完整的创建过程,我要再创建一个的话,还得从头开始,不如复制,使用原型模式实现
Demo:
interface Potrotype{
public function copy();
}
//通过在原型类中加一个copy方法,使得这个原型类的实例可以被复制
class Demo implements Potrotype{
private $state;
public function setState($state){
$this->state = $state;
}
public function getState(){
return $this->state;
}
public function copy(){
//浅拷贝 指针拷贝是浅拷贝
return clone $this;
/ *
* 深拷贝 值拷贝是深拷贝
*/
// $tmp = serialize($this);
// $tmp = unserialize($tmp);
// return $tmp;
}
}
class Client{
public static function main(){
$obj1 = new Demo();
$obj1->setState(23);
$obj2 = $obj1->copy();
$res = $obj2->getState();
echo $res;
}
}
Client::main();
php clone 方法是浅拷贝
浅拷贝
class myClass{
public $data;
}
$sss ="aaa";
$obj1 = new myClass();
$obj1->data =&$sss; //注意,这里是个引用!
$obj2 = clone $obj1;
$obj2->data="bbb"; //这时,$obj1->data的值变成了"bbb"而不是"aaa"!
var_dump($obj1);//bbb
var_dump($obj2);//bbb
深拷贝
class myClass{
public $data;
function copy(){
$tmp = serialize($this);
$tmp = unserialize($tmp);
return $tmp;
}
}
$sss ="aaa";
$obj1 = new myClass();
$obj1->data =&$sss; //注意,这里是个引用!
$obj2 = $obj1->copy();
$obj2->data="bbb"; //这时,$obj1->data的值变成了"bbb"而不是"aaa"!
var_dump($obj1);//aaa
var_dump($obj2);//bbb
值拷贝是深拷贝,而指针拷贝是浅拷贝。
浅复制呢又称为浅拷贝,深复制又称为深拷贝。
浅复制的话,就是通过一个原型实例(这里暂称为老对象)克隆所得到的对象(这里暂时称为新对象),
而这个新对象中所有的值类型变量都含有与老对象相同的值,
但是,新对象所有的对其他对象的引用却是和老对象指向同一个地方,
即对引用类型来说,老对象和新对象指向同一个引用对象。
深复制呢,和浅复制就一点不同,那就是,
新对象所有的对其他对象的引用都是指向了复制过的对象,而不再是和老对象指向同一个对象。
- 设计模式:原型模式
- 设计模式------原型模式
- 设计模式 原型模式
- 设计模式-【原型模式】
- 设计模式-原型模式
- 设计模式-原型模式
- 设计模式-原型模式
- 设计模式-原型模式
- 设计模式- 原型模式
- 设计模式:原型模式
- 设计模式 - 原型模式
- 设计模式-原型模式
- 【设计模式】原型模式
- 设计模式-原型模式
- 设计模式-原型模式
- 【设计模式】原型模式
- 设计模式----原型模式
- 设计模式------原型模式
- 数据结构:有向无环图的表示
- Android studio 自定义快捷键 aul,修改自动补全快捷键为 Alt+/
- 多态的概念和作用(深入理解)
- Spring项目使用JUnit4进行测试
- (function($){...})(jQuery)是什么意思
- 设计模式-原型模式
- 集成支付宝支付
- Java中的24种设计模式与7大原则
- spring_boot 发布成war包 ,部署到外部的tomcat
- item-note左右对齐
- Struts2学习
- Dagger2学习笔记之配置
- matlab合并向量;;
- 设置UICollectionViewCell选中颜色