您的位置:首页 > 编程语言 > PHP开发

PHP设计模式(2)-原型模式

2013-01-19 23:39 441 查看
原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。它从一个对象再创建另外一个可以定制的对象,而且不需要知道任何创建的细节。

<?php
/**********原型模式******/
header("Content-type: text/html; charset=utf-8");
class Resume{
private $name;
private $sex;
private $age;
private $timeArea;
private $company;
function __construct($name){
$this->name=$name;
}
function SetPersonalInfo($sex,$age){
$this->sex=$sex;
$this->age=$age;
}
function SetWorkExperience($timeArea,$company){
$this->timeArea=$timeArea;
$this->company=$company;
}
function display(){
echo "姓名".$this->name."<br>";
echo "性别".$this->sex."<br>";
echo "年龄".$this->age."<br>";
echo "工作地点".$this->timeArea."<br>";
echo "公司".$this->company."<br>";
}
function copy(){
return clone $this;
}
}

$Resume_a=new Resume("大鸟");
$Resume_a->SetPersonalInfo("男",29);
$Resume_a->SetWorkExperience("1998-2000","XX公司");

$Resume_b=$Resume_a->copy();
$Resume_b->SetWorkExperience("2000-2006","YY公司");

$Resume_a->display();
echo "**********<br>";
$Resume_b->display();
echo "**********<br>";

注意:clone只会给应用的对象生成一个浅复制,产品对象会和源对象有一样的属性。如果源对象的属性是对象,那么这些对象的属性不会被直接复制到产品中,而是产品会引用同样的对象属性。要实现深复制,就需要使用__clone(),来定制复制。

关于clone():

对于一般的对象克隆,没有什么的了,但是如果克隆的对象属性中有引用类成员(&)或者属性是对个对象的话,一个对象属性的改变会影响到另外一个对象属性。

例如下面的例子(浅复制):

<?php
class a{
public $s = '';
}
class b{
public $a = null;
public $str = null;
}
$str = 'this is $str';
$b_1 = new b();
$b_1->a = new a();
$b_1->str = & $str;

$b_1->a->s = 'this is b1 a s';
$b_2 = clone $b_1;
$b_2->a->s = 'this is b2 a s';
$b_2->str = 'this is b2 $str';
echo $b_1->a->s;
echo "<br>*********<br>";
echo $b_1->str;
echo "<br>*********<br>";
echo $b_2->a->s;
echo "<br>*********<br>";
echo $b_2->str;

下面的例子是深复制:

<?php
class a{
public $s = '';
}
class b{
public $a = null;
public $str = null;
public function __clone(){
$b = $this->str;
$this->str = & $b;
$this->a = clone($this->a);
}
}

$str = '123';
$b_1 = new b();
$b_1->a = new a();
$b_1->str = & $str;

$b_1->a->s = 'b1';
$b_2 = clone $b_1;
$b_2->a->s = 'aaaaa';
$b_2->str = 'nihao';
echo $b_1->a->s;
echo "<br>*********<br>";
echo $b_1->str;
echo "<br>*********<br>";
echo $b_2->a->s;
echo "<br>*********<br>";
echo $b_2->str;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: