PHP中的工廠模式和原型模式怎么實(shí)現(xiàn)-創(chuàng)新互聯(lián)

本篇內(nèi)容介紹了“PHP中的工廠模式和原型模式怎么實(shí)現(xiàn)”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),增城企業(yè)網(wǎng)站建設(shè),增城品牌網(wǎng)站建設(shè),網(wǎng)站定制,增城網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,增城網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

上代碼

<?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ǔ)句是不能滿足這種需求的。要滿足這種需求雖然有很多途徑,但實(shí)現(xiàn)clone()方法是其中最簡(jiǎn)單,也是最高效的手段。
			//如果定義了__clone()方法,則新創(chuàng)建的對(duì)象(復(fù)制生成的對(duì)象)中的__clone()方法會(huì)被調(diào)用, 可用于修改屬性的值
			//你要先new對(duì)象才能clone,一個(gè)是實(shí)例化,一個(gè)是克隆
			//對(duì)象的復(fù)制是通過(guò)關(guān)鍵字 clone 來(lái)實(shí)現(xiàn)的。用 clone 克隆出來(lái)的對(duì)象與原對(duì)象沒(méi)有任何關(guān)系,它是把原來(lái)的對(duì)象從當(dāng)前的位置重新復(fù)制了一份,也就是相當(dāng)于在內(nèi)存中新開(kāi)辟了一塊空間
			return clone $this;
		}

		public function deepCopy(){
			//序列化深拷貝:利用序列化來(lái)做深拷貝,把對(duì)象寫到流里的過(guò)程是序列化的過(guò)程,這一過(guò)程稱為“冷凍”或“腌咸菜”,反序列化對(duì)象的過(guò)程叫做“解凍”或“回鮮”。這種深復(fù)制比較簡(jiǎn)單
			//當(dāng)數(shù)組值包含如雙引號(hào)、單引號(hào)或冒號(hào)等字符時(shí),它們被反序列化后,可能會(huì)出現(xiàn)問(wèn)題。為了克服這個(gè)問(wèn)題,一個(gè)巧妙的技巧是使用base64_encode和base64_decode。
			//但是base64編碼將增加字符串的長(zhǎ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;
		}
	}


//上面的原型基本上就寫完了

	class Demo{
		public $string;
	}
	class UsePrototype{
		public function shallow(){
			$demo = new Demo();
			$demo->string = "susan";
			//新建
			$object_shallow_first = new ConcretePrototype($demo);
			//淺復(fù)制
			$object_shallow_second = $object_shallow_first->shallowCopy();
			//之下代碼可以刪除
			echo '新對(duì)象:<br/>';
			var_dump($object_shallow_first->getName());
        	echo '淺復(fù)制的對(duì)象<br/>';
        	var_dump($object_shallow_second->getName());
        	echo '<br/>';

        	$demo->string = "jack";
        
        	echo '我改變新建的對(duì)象屬性:<br/>';
        	var_dump($object_shallow_first->getName());
        	echo '淺復(fù)制是同一塊內(nèi)存,受影響<br/>';
        	var_dump($object_shallow_second->getName());
        	echo '<br/>';
		}

		public function deep(){
			//新建對(duì)象,構(gòu)造函數(shù)沒(méi)參數(shù)就不用帶括號(hào)
			$demo = new Demo;
			$demo->string = "Siri";
			//新建
			$object_shallow_first = new ConcretePrototype($demo);
			//淺復(fù)制
			$object_shallow_second = $object_shallow_first->deepCopy();
			//之下代碼可以刪除
			echo '新對(duì)象:<br/>';
			var_dump($object_shallow_first->getName());
        	echo '深復(fù)制的對(duì)象<br/>';
        	var_dump($object_shallow_second->getName());
        	echo '<br/>';

        	$demo->string = "jack";
        
        	echo '我改變新建的對(duì)象屬性:<br/>';
        	var_dump($object_shallow_first->getName());
        	echo '深復(fù)制是完全新的對(duì)象,不受影響<br/>';
        	var_dump($object_shallow_second->getName());
        	echo '<br/>';
		}
	}

	//調(diào)用

	$up = new UsePrototype;
	$up->shallow();
	echo '<hr>';
	$up->deep();
	//原型模式的主要思想是基于現(xiàn)有的對(duì)象克隆一個(gè)新的對(duì)象出來(lái),一般是用對(duì)象內(nèi)部提供的克隆方法,通過(guò)該方法返回一個(gè)對(duì)象的副本,這種創(chuàng)建對(duì)象的方式,相比我們之前說(shuō)的幾類創(chuàng)建型模式還是有區(qū)別的,之前的講述的工廠方法模式與抽象工廠都是通過(guò)工廠封裝具體的 new 操作的過(guò)程,返回一個(gè)新的對(duì)象,有的時(shí)候我們通過(guò)這樣的創(chuàng)建工廠創(chuàng)建對(duì)象不值得,特別是以下的幾個(gè)場(chǎng)景,可能使用原型模式更簡(jiǎn)單、效率更高:

	//如果說(shuō)我們的對(duì)象類型不是剛開(kāi)始就能確定,而是在運(yùn)行時(shí)確定的話,那么我們通過(guò)這個(gè)類型的對(duì)象克隆出一個(gè)新的類型更容易。
	//有的時(shí)候我們可能在實(shí)際的項(xiàng)目中需要一個(gè)對(duì)象在某個(gè)狀態(tài)下的副本,這個(gè)前提很重要,這點(diǎn)怎么理解呢,例如有的時(shí)候我們需要對(duì)比一個(gè)對(duì)象經(jīng)過(guò)處理后的狀態(tài)和處理前的狀態(tài)是否發(fā)生過(guò)改變,可能我們就需要在執(zhí)行某段處理之前,克隆這個(gè)對(duì)象此時(shí)狀態(tài)的副本,然后等執(zhí)行后的狀態(tài)進(jìn)行相應(yīng)的對(duì)比,這樣的應(yīng)用在項(xiàng)目中也是經(jīng)常會(huì)出現(xiàn)的。
	//當(dāng)我們處理的對(duì)象比較簡(jiǎn)單,并且對(duì)象之間的區(qū)別很小,可能只是很固定的幾個(gè)屬性不同的時(shí)候,使用原型模式更合適。


?>

“PHP中的工廠模式和原型模式怎么實(shí)現(xiàn)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

當(dāng)前文章:PHP中的工廠模式和原型模式怎么實(shí)現(xiàn)-創(chuàng)新互聯(lián)
當(dāng)前路徑:http://muchs.cn/article10/dcjdgo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航定制網(wǎng)站、ChatGPT、網(wǎng)頁(yè)設(shè)計(jì)公司、外貿(mào)網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)