- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- PHP中的工廠(chǎng)模式和原型模式怎么實(shí)現
本篇內容介紹了“PHP中的工廠(chǎng)模式和原型模式怎么實(shí)現”的有關(guān)知識,在實(shí)際案例的操作過(guò)程中,不少人都會(huì )遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學(xué)有所成!
上代碼
<?php interface Prototype{ public function shallowCopy(); public function deepCopy(); } class ConcretePrototype implements Prototype{ private $_name; public function __construct($name){ $this->_name = $name; } public function setName($name){ $this->_name = $name; } public function shallowCopy(){ //在php語(yǔ)言中,用簡(jiǎn)單的賦值語(yǔ)句是不能滿(mǎn)足這種需求的。要滿(mǎn)足這種需求雖然有很多途徑,但實(shí)現clone()方法是其中最簡(jiǎn)單,也是最高效的手段。 //如果定義了__clone()方法,則新創(chuàng )建的對象(復制生成的對象)中的__clone()方法會(huì )被調用, 可用于修改屬性的值 //你要先new對象才能clone,一個(gè)是實(shí)例化,一個(gè)是克隆 //對象的復制是通過(guò)關(guān)鍵字 clone 來(lái)實(shí)現的。用 clone 克隆出來(lái)的對象與原對象沒(méi)有任何關(guān)系,它是把原來(lái)的對象從當前的位置重新復制了一份,也就是相當于在內存中新開(kāi)辟了一塊空間 return clone $this; } public function deepCopy(){ //序列化深拷貝:利用序列化來(lái)做深拷貝,把對象寫(xiě)到流里的過(guò)程是序列化的過(guò)程,這一過(guò)程稱(chēng)為“冷凍”或“腌咸菜”,反序列化對象的過(guò)程叫做“解凍”或“回鮮”。這種深復制比較簡(jiǎn)單 //當數組值包含如雙引號、單引號或冒號等字符時(shí),它們被反序列化后,可能會(huì )出現問(wèn)題。為了克服這個(gè)問(wèn)題,一個(gè)巧妙的技巧是使用base64_encode和base64_decode。 //但是base64編碼將增加字符串的長(cháng)度。為了克服這個(gè)問(wèn)題,可以和gzcompress一起使用。 //base64_encode(gzcompress(serialize($obj)));序列化 //unserialize(gzuncompress(base64_decode($txt)));反序列化 $serialize_obj = serialize($this); $clone_obj = unserialize($serialize_obj); return $clone_obj; } public function getName(){ return $this->_name; } } //上面的原型基本上就寫(xiě)完了 class Demo{ public $string; } class UsePrototype{ public function shallow(){ $demo = new Demo(); $demo->string = "susan"; //新建 $object_shallow_first = new ConcretePrototype($demo); //淺復制 $object_shallow_second = $object_shallow_first->shallowCopy(); //之下代碼可以刪除 echo '新對象:<br/>'; var_dump($object_shallow_first->getName()); echo '淺復制的對象<br/>'; var_dump($object_shallow_second->getName()); echo '<br/>'; $demo->string = "jack"; echo '我改變新建的對象屬性:<br/>'; var_dump($object_shallow_first->getName()); echo '淺復制是同一塊內存,受影響<br/>'; var_dump($object_shallow_second->getName()); echo '<br/>'; } public function deep(){ //新建對象,構造函數沒(méi)參數就不用帶括號 $demo = new Demo; $demo->string = "Siri"; //新建 $object_shallow_first = new ConcretePrototype($demo); //淺復制 $object_shallow_second = $object_shallow_first->deepCopy(); //之下代碼可以刪除 echo '新對象:<br/>'; var_dump($object_shallow_first->getName()); echo '深復制的對象<br/>'; var_dump($object_shallow_second->getName()); echo '<br/>'; $demo->string = "jack"; echo '我改變新建的對象屬性:<br/>'; var_dump($object_shallow_first->getName()); echo '深復制是完全新的對象,不受影響<br/>'; var_dump($object_shallow_second->getName()); echo '<br/>'; } } //調用 $up = new UsePrototype; $up->shallow(); echo '<hr>'; $up->deep(); //原型模式的主要思想是基于現有的對象克隆一個(gè)新的對象出來(lái),一般是用對象內部提供的克隆方法,通過(guò)該方法返回一個(gè)對象的副本,這種創(chuàng )建對象的方式,相比我們之前說(shuō)的幾類(lèi)創(chuàng )建型模式還是有區別的,之前的講述的工廠(chǎng)方法模式與抽象工廠(chǎng)都是通過(guò)工廠(chǎng)封裝具體的 new 操作的過(guò)程,返回一個(gè)新的對象,有的時(shí)候我們通過(guò)這樣的創(chuàng )建工廠(chǎng)創(chuàng )建對象不值得,特別是以下的幾個(gè)場(chǎng)景,可能使用原型模式更簡(jiǎn)單、效率更高: //如果說(shuō)我們的對象類(lèi)型不是剛開(kāi)始就能確定,而是在運行時(shí)確定的話(huà),那么我們通過(guò)這個(gè)類(lèi)型的對象克隆出一個(gè)新的類(lèi)型更容易。 //有的時(shí)候我們可能在實(shí)際的項目中需要一個(gè)對象在某個(gè)狀態(tài)下的副本,這個(gè)前提很重要,這點(diǎn)怎么理解呢,例如有的時(shí)候我們需要對比一個(gè)對象經(jīng)過(guò)處理后的狀態(tài)和處理前的狀態(tài)是否發(fā)生過(guò)改變,可能我們就需要在執行某段處理之前,克隆這個(gè)對象此時(shí)狀態(tài)的副本,然后等執行后的狀態(tài)進(jìn)行相應的對比,這樣的應用在項目中也是經(jīng)常會(huì )出現的。 //當我們處理的對象比較簡(jiǎn)單,并且對象之間的區別很小,可能只是很固定的幾個(gè)屬性不同的時(shí)候,使用原型模式更合適。 ?>
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站