首頁  >  文章  >  後端開發  >  php原型模式的實作方法及介紹(附程式碼)

php原型模式的實作方法及介紹(附程式碼)

不言
不言轉載
2019-02-18 14:29:182383瀏覽

這篇文章帶給大家的內容是關於php原型模式的實作方法及介紹(附程式碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

用原型實例指定創建物件的種類,並且透過拷貝這些原型創建新的物件 

的平行繼承層次的出現是工廠方法模式帶來的一個問題。這是一種讓一些程式設計師不舒服的耦合。每次添加產品家族時,你就被迫去創建一個相關的具體創建者。在一個快速成長的系統裡會包含越來越多的產品,而維護這種關係便會很快令人厭煩。
避免這種依賴的辦法是使用PHP的 clone關鍵字複製已存在的具體產品,然後,具體產品類本身便成為它們自己生成的基礎。這使是原型模式。使用該模式我們可以用組合取代繼承。這樣的轉變則促進了程式碼運行時的靈活性,並減少了必須創建的類別的數。

假設有一款「文明」( Civilization)風格的網路遊戲,可在區塊組成的格子中操作戰鬥單元(unit)。每個區塊分別代表海洋、平原和森林。地形的類別約束了佔有區塊的單元的格鬥能力。我們可以有一個 errainFactory物件來提供Sea、 Forest和 Plains.物件,我們決定允許使用者在完全不同的環境裡選擇,於是Sea可能是 Marssea和 Earthsea的抽象父類。 Forest(森林)和P1ains(平原)物件也會有相似的實作。這裡的分支便構成了抽象工廠模式。我們有截然不同的產品體系(Sea、 Plains、 Forests),而這些產品家族間有超越繼承的緊密聯繫,如 Earth(地球)和Mars(火星),它們都同時存在海洋、森林和平原地形。圖9-10所示的類別圖展示如何對這些產品應用抽象工廠和工廠方法模式。

你可以看到,我們依賴繼承來組合工廠生成的terrain(地形)家族產品,這的確是一個可行的解決方案,但這需要有一個大型的繼承體系,並且相對來說不那麼靈活。當你不想要平行的整合體係而需要最大化運行時的靈活性,可以使用抽象工廠模式的強大變形一原型模式

<?php

//海洋
class Sea{
	//可导航性
	private $navigability=0;
	function __construct($navigability){
		$this->navigability=$navigability;
	}
}
//地球海洋
class EarthSea extends Sea{}

//火星海洋
class MarsSea extends Sea{}
//平原
class Plains{}
//地球平原
class EarthPlains extends Plains{}

//火星平原
class MarsPlains extends Plains{}

//森岭
class Forest{}
//地球森林
class EarthForest extends Forest{}

//火星森林
class MarsForest extends Forest{}

//地形工厂
class TerrainFactory{
	private $sea;
	private $forest;
	private $plains;
	
	function __construct(Sea $sea,Plains $plains,Forest $forest){
		$this->sea=$sea;
		$this->plains=$plains;
		$this->forest=$forest;
	}
	
	function getSea(){
		return clone $this->sea;
	}
	
	function getPlains(){
		return clone $this->plains;
	}
	
	function getForest(){
		return clone $this->forest;
	}
}

class Contained{}
class Container{
	public $contained;
	
	function __construct(){
		$this->contained=new Contained();
	}
	function __clone(){
		//确保被克隆的对象持有的是self::$contained的克隆而不是引用
		$this->contained=clone $this->contained;
	}
}
$factory=new TerrainFactory(new EarthSea(-1), new EarthPlains(), new EarthForest());

print_r($factory->getSea());

print "<hr>";

print_r($factory->getPlains());

print "<hr>";

print_r($factory->getForest());

輸出結果:

EarthSea Object ( [navigability:Sea:private] => -1 )


EarthPlains Object ( )


#EarthForest Object ( )

以上是php原型模式的實作方法及介紹(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除