[toc]
## 舉個例子
> 《閃電俠》里面一個反派叫 Danton Black 的超級人類,擁有復制自身的超能力,能夠變身出六個自己
> 程序員就需要這種能力,一個寫UI, 一個寫前端, 一個寫APP, 一個建數據庫, 一個寫后臺, 一個維護服務器...
## 代碼示例
```php
<?php
// 人
class Person {
private $name;
private $age;
public function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
public function showMyself() {
echo "我是{$this->name}, 年齡{$this->age}" . PHP_EOL;
}
public function coding() {
echo "我是一個碼農, 我在用雙手改變世界以及我的發際線..." . PHP_EOL;
}
public function reading() {
echo "閱讀是我快樂, 我愛閱讀勝過愛左手..." . PHP_EOL;
}
public function fallInLove() {
echo "神鬼狐仙, 風月無邊...";
}
public function copy() {
return clone($this);
}
}
// 代碼測試
$tony = new Person("Tony", 26);
$tony->showMyself();
$tony->coding();
$tony1 = $tony->copy();
$tony1->showMyself();
$tony1->reading();
$tony2 = $tony->copy();
$tony2->showMyself();
$tony2->fallInLove();
```
```
D:\soft\php72\php.exe D:\project\php_dp\index.php
我是Tony, 年齡26
我是一個碼農, 我在用雙手改變世界以及我的發際線...
我是Tony, 年齡26
閱讀是我快樂, 我愛閱讀勝過愛左手...
我是Tony, 年齡26
神鬼狐仙, 風月無邊...
Process finished with exit code 0
```
## 什么是克隆模式?
> 通過拷貝自身的屬性來創建一個新對象的過程叫做克隆模式。
> 克隆模式的核心就是一個 Clone 方法,Clone 方法的功能就是拷貝父本的所有屬性
> 分配一塊新的內存空間給新的對象; 拷貝父本對象的所有屬性。
> 深拷貝:賦值時值完全復制,完全的copy,對其中一個作出改變,不會影響另一個
> 淺拷貝:賦值時,引用賦值,相當于取了一個別名。對其中一個修改,會影響另一個
> PHP中, = 賦值時,普通對象是深拷貝,但對對象來說,是淺拷貝。也就是說,對象的賦值是引用賦值。
> php5中,對象的` = `賦值和傳遞都是引用。要想實現拷貝副本,php提供了`clone`函數實現。

## 優缺點
**克隆模式的優點**
1.克隆模式是通過內存拷貝的方式進行復制,比 new 的方式創建對象性能更好;
1.通過深拷貝的方式,可以方便地創建一個具有相同屬性和行為的另一個對象,特別是對于復雜對象,方便性尤為體現。
**克隆模式的缺點**
1. 通過克隆的方式創建對象,不會執行類的構造函數,這不一定是缺點,但大家使用的時候需要注意這一點。
## 應用場景
1. 如果創建新對象(如復雜對象)成本較大,我們可以利用已有的對象進行復制來獲得。
1. 當類的初始化需要消耗非常多的資源時,如需要消耗很多的數據、硬件等資源。