原文地址:PHP設計模式(九):原型設計模式php
在PHP設計模式(八):工廠模式中咱們介紹了建立設計模式(Creation patterns)中的工廠模式,下面咱們將介紹另外一種原型設計模式(Prototype Method)。
在PHP中,原型設計模式依靠cloning複製對象來實現。經過cloning構造的對象,將大量節省新對象的構造時間。設計模式
簡單來講,當你但願根據已有的對象來建立新對象時。
爲何會有這種需求?想象一下,你在作細胞分裂的項目,每個細胞都是一個對象,如今你有一個細胞類,每個新的細胞都是由這個類生成的,不一樣的細胞只是內部的狀態參數不一樣。
當分裂到第N代的時候,已經和初代大不同了,你是願意使用第N代的副本修改一下呢?仍是願意從初代慢慢推演?函數
PHP提供了內建的__clone()函數以及clone關鍵字,來實現對象的複製。下面給出一個例子:this
<?php abstract class Cell { public $id; public $dna; abstract function __clone(); } class WhaleCell extends Cell { public function __construct() { $this->id = 1; $this->dna = "ATCG"; } public function displayDNA() { echo $this->dna . "\n"; } function __clone() { $this->id = $this->id + 1; if ($this->id % 3 == 0) { $this->dna = $this->dna . "AT"; } if ($this->id % 5 == 0) { $this->dna = $this->dna . "CG"; } } } $whaleCell = new WhaleCell(); $whaleCell->displayDNA(); $whaleCell2 = clone $whaleCell; $whaleCell2->displayDNA(); $whaleCell3 = clone $whaleCell2; $whaleCell3->displayDNA(); $whaleCell4 = clone $whaleCell3; $whaleCell4->displayDNA(); $whaleCell5 = clone $whaleCell4; $whaleCell5->displayDNA(); ?>
運行一下:設計
ATCG ATCG ATCGAT ATCGAT ATCGATCG
程序簡單的模擬了DNA的遺傳突變,每遺傳三代,DNA增長AT,每遺傳五代,DNA增長CG。code
使用clone建立新對象時,並不會觸發類的構造函數。這也是在使用原型設計模式中須要注意的一點。clone的底層實現並非調用類的構造函數來建立一個類,而是直接拷貝一個類的地址空間,生成另外一個類。這種直接拷貝也帶來了高效。
事實上,使用構造函數並不必定是一個好的設計,因爲構造函數內的邏輯沒法被外部控制,當須要修改一個類構造時的邏輯時,除了修改類的構造函數實現之外,別無他法,這破壞了類的封裝。對象
原型設計模式帶來了另外一種建立對象的思路,合理的使用cloning構造對象,將提升程序建立新對象時的效率。get