溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP中的工廠模式和原型模式怎么實現

發布時間:2021-08-16 21:14:22 來源:億速云 閱讀:165 作者:chen 欄目:開發技術

本篇內容介紹了“PHP中的工廠模式和原型模式怎么實現”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

上代碼

<?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語言中,用簡單的賦值語句是不能滿足這種需求的。要滿足這種需求雖然有很多途徑,但實現clone()方法是其中最簡單,也是最高效的手段。
			//如果定義了__clone()方法,則新創建的對象(復制生成的對象)中的__clone()方法會被調用, 可用于修改屬性的值
			//你要先new對象才能clone,一個是實例化,一個是克隆
			//對象的復制是通過關鍵字 clone 來實現的。用 clone 克隆出來的對象與原對象沒有任何關系,它是把原來的對象從當前的位置重新復制了一份,也就是相當于在內存中新開辟了一塊空間
			return clone $this;
		}

		public function deepCopy(){
			//序列化深拷貝:利用序列化來做深拷貝,把對象寫到流里的過程是序列化的過程,這一過程稱為“冷凍”或“腌咸菜”,反序列化對象的過程叫做“解凍”或“回鮮”。這種深復制比較簡單
			//當數組值包含如雙引號、單引號或冒號等字符時,它們被反序列化后,可能會出現問題。為了克服這個問題,一個巧妙的技巧是使用base64_encode和base64_decode。
			//但是base64編碼將增加字符串的長度。為了克服這個問題,可以和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);
			//淺復制
			$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(){
			//新建對象,構造函數沒參數就不用帶括號
			$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();
	//原型模式的主要思想是基于現有的對象克隆一個新的對象出來,一般是用對象內部提供的克隆方法,通過該方法返回一個對象的副本,這種創建對象的方式,相比我們之前說的幾類創建型模式還是有區別的,之前的講述的工廠方法模式與抽象工廠都是通過工廠封裝具體的 new 操作的過程,返回一個新的對象,有的時候我們通過這樣的創建工廠創建對象不值得,特別是以下的幾個場景,可能使用原型模式更簡單、效率更高:

	//如果說我們的對象類型不是剛開始就能確定,而是在運行時確定的話,那么我們通過這個類型的對象克隆出一個新的類型更容易。
	//有的時候我們可能在實際的項目中需要一個對象在某個狀態下的副本,這個前提很重要,這點怎么理解呢,例如有的時候我們需要對比一個對象經過處理后的狀態和處理前的狀態是否發生過改變,可能我們就需要在執行某段處理之前,克隆這個對象此時狀態的副本,然后等執行后的狀態進行相應的對比,這樣的應用在項目中也是經常會出現的。
	//當我們處理的對象比較簡單,并且對象之間的區別很小,可能只是很固定的幾個屬性不同的時候,使用原型模式更合適。


?>

“PHP中的工廠模式和原型模式怎么實現”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女