摘要:原型設計模式中的構造函數使用創建新對象時,并不會觸發類的構造函數。事實上,使用構造函數并不一定是一個好的設計,由于構造函數內的邏輯無法被外部控制,當需要修改一個類構造時的邏輯時,除了修改類的構造函數實現以外,別無他法,這破壞了類的封裝。
Introduction原文地址:PHP設計模式(九):原型設計模式
在PHP設計模式(八):工廠模式中我們介紹了創建設計模式(Creation patterns)中的工廠模式,下面我們將介紹另一種原型設計模式(Prototype Method)。
在PHP中,原型設計模式依靠cloning復制對象來實現。通過cloning構造的對象,將大量節省新對象的構造時間。
簡單來說,當你希望根據已有的對象來創建新對象時。
為什么會有這種需求?想象一下,你在做細胞分裂的項目,每一個細胞都是一個對象,現在你有一個細胞類,每一個新的細胞都是由這個類生成的,不同的細胞只是內部的狀態參數不同。
當分裂到第N代的時候,已經和初代大不一樣了,你是愿意使用第N代的副本修改一下呢?還是愿意從初代慢慢推演?
PHP提供了內建的__clone()函數以及clone關鍵字,來實現對象的復制。下面給出一個例子:
id = 1; $this->dna = "ATCG"; } public function displayDNA() { echo $this->dna . " "; } 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。
原型設計模式中的構造函數使用clone創建新對象時,并不會觸發類的構造函數。這也是在使用原型設計模式中需要注意的一點。clone的底層實現并不是調用類的構造函數來創建一個類,而是直接拷貝一個類的地址空間,生成另一個類。這種直接拷貝也帶來了高效。
事實上,使用構造函數并不一定是一個好的設計,由于構造函數內的邏輯無法被外部控制,當需要修改一個類構造時的邏輯時,除了修改類的構造函數實現以外,別無他法,這破壞了類的封裝。
原型設計模式帶來了另一種創建對象的思路,合理的使用cloning構造對象,將提高程序創建新對象時的效率。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21674.html
摘要:開源的論壇網站開源的論壇源代碼接口管理接口環境下環境一鍵安裝軟件二前端資源中國淘寶鏡像在國內,由于墻的原因,安裝包速度很慢,所以,這里建議使用淘寶提供的鏡像安裝前端資源。 為者常成,行者常至。 一、PHP資料 1、V2EX way to explore 分享和探索的地方2、Laravel China 中國最大的 Laravel 和 PHP 開發者社區3、Composer使用方法4、Pa...
摘要:開源的論壇網站開源的論壇源代碼接口管理接口環境下環境一鍵安裝軟件二前端資源中國淘寶鏡像在國內,由于墻的原因,安裝包速度很慢,所以,這里建議使用淘寶提供的鏡像安裝前端資源。 為者常成,行者常至。 一、PHP資料 1、V2EX way to explore 分享和探索的地方2、Laravel China 中國最大的 Laravel 和 PHP 開發者社區3、Composer使用方法4、Pa...
摘要:我們通過一個簡單的例子與圖示,來了解構造函數,實例與原型三者之間的關系。而原型對象的指向構造函數。于是根據構造函數與原型的特性,我們就可以將在構造函數中,通過聲明的屬性與方法稱為私有變量與方法,它們被當前被某一個實例對象所獨有。 showImg(https://segmentfault.com/img/remote/1460000008593382); 如果要我總結一下學習前端以來我遇...
閱讀 3640·2023-04-26 02:07
閱讀 3150·2021-09-22 15:55
閱讀 2534·2021-07-26 23:38
閱讀 3119·2019-08-29 15:16
閱讀 2008·2019-08-29 11:16
閱讀 1746·2019-08-29 11:00
閱讀 3583·2019-08-26 18:36
閱讀 3165·2019-08-26 13:32