10
8
Clicks: 6614 Date: 2014-04-21 21:48:35 Power By 李軒Lane
原型模式提取重復功能,避免了程序員喜歡復制粘貼的壞習慣。設計模式中的原型模式就是,用原型實例指定創建對象的重力,通過拷貝這些原型來創建新的對象從一個對象再創建另外一個可定制的對象,而且不需要知道創建的任何細節。
淺復制 VS 深復制:
淺復制是對數字,字符串等類型進行傳值復制,而對對象來講是引用復制,即只是對內存地址進行賦值而不是新建一個對象的變量。在淺復制中,對一個對象的屬性改變,另一個對象的該屬性也會被改變,類比于C語言的指針,PHP在調用方法時&$var的傳遞。
以PHP為代碼環境。
//家庭類
class Home{
public $money;
public function __construct($money){
$this->money = $money;
}
}
//家庭成員類
class member{
public $id;
public $name;
public $obj;
public function __construct($id, $name, Home $obj){
$this->setId($id);
$this->setName($name);
$this->obj = $obj;
}
public function setId($id){
$this->id = $id;
}
public function setName($name){
$this->name = $name;
}
public function display(){
echo 'ID為' . $this->id . ',名稱為' . $this->name . ',資產為' . $this->obj->money . '
';
}
public function __clone(){
//深度復制(克隆),因為克隆只能克隆數字,字符串等,對對象變量是引用傳值。
$this->obj = clone $this->obj;
}
}
//客戶端/接口
$obj1 = new member(1, '小軒', new Home('10000'));
$obj1->display();
$obj2 = clone $obj1;
$obj2->setId(2);
$obj2->setName('小瑋');
$obj2->obj->money = 2000;
$obj2->display();
//根據這句輸出可以看到,對象1和對象2值是不一樣的,刪掉上面的注釋部分再看,又是一樣的了,這就是深復制和淺復制。
$obj1->display();
?>