Heim  >  Artikel  >  Backend-Entwicklung  >  Implementierungsmethode und Einführung des PHP-Prototypmodus (mit Code)

Implementierungsmethode und Einführung des PHP-Prototypmodus (mit Code)

不言
不言nach vorne
2019-02-18 14:29:182349Durchsuche

Der Inhalt dieses Artikels befasst sich mit der Implementierungsmethode und der Einführung des PHP-Prototypmodus (mit Code). Ich hoffe, dass er für Sie hilfreich ist.

Verwenden Sie Prototypinstanzen, um die zu erstellenden Objekttypen anzugeben, und erstellen Sie neue Objekte durch Kopieren dieser Prototypen

Die Entstehung der parallelen Vererbungshierarchie ist Durch das Factory-Methodenmuster entsteht eine Frage. Dies ist eine Kopplung, die einigen Programmierern Unbehagen bereitet. Jedes Mal, wenn Sie eine Produktfamilie hinzufügen, müssen Sie einen zugehörigen spezifischen Ersteller erstellen. In einem schnell wachsenden System, das immer mehr Produkte umfasst, kann die Pflege dieser Beziehungen schnell mühsam werden.
Die Möglichkeit, diese Abhängigkeit zu vermeiden, besteht darin, das Schlüsselwort clone von PHP zu verwenden, um ein vorhandenes spezifisches Produkt zu kopieren. Dann werden die spezifischen Produktkategorien selbst zur Grundlage für ihre eigene Generierung. Dies ist der Prototypenmodus. Mit diesem Muster können wir Zusammensetzung anstelle von Vererbung verwenden. Eine solche Verschiebung fördert die Flexibilität der Codelaufzeit und reduziert die Anzahl der Klassen, die erstellt werden müssen.

Angenommen, es gäbe ein Online-Spiel im „Civilization“-Stil, in dem Kampfeinheiten in einem aus Blöcken bestehenden Raster eingesetzt werden können. Jeder Block stellt einen Ozean, eine Ebene und einen Wald dar. Die Art des Geländes schränkt die Kampffähigkeit der Einheit ein, die den Block besetzt. Wir könnten ein TerrainFactory-Objekt haben, das Sea-, Forest- und Plains-Objekte bereitstellt. Wir haben uns entschieden, dem Benutzer die Wahl zwischen völlig unterschiedlichen Umgebungen zu ermöglichen, sodass Sea eine abstrakte übergeordnete Klasse für Marssea und Earthsea sein könnte. Forest- und P1ains-Objekte werden ähnliche Implementierungen haben. Die Zweige bilden hier das abstrakte Fabrikmuster. Wir haben völlig unterschiedliche Produktsysteme (Meer, Ebenen, Wälder), und diese Produktfamilien haben über die Vererbung hinaus enge Verbindungen, wie zum Beispiel Erde und Mars, die beide Ozeane, Wälder und Ebenen haben. Das in Abbildung 9-10 dargestellte Klassendiagramm zeigt, wie die Muster „Abstrakte Fabrik“ und „Fabrikmethode“ auf diese Produkte angewendet werden.

Wie Sie sehen, verwenden wir die Vererbung, um die von der Fabrik generierten Gelände-(Terrain-)Familienprodukte zu kombinieren. Dies ist zwar eine praktikable Lösung, erfordert jedoch ein großes Vererbungssystem und ist relativ unhandlich . Wenn Sie kein paralleles Integrationssystem wünschen, aber die Laufzeitflexibilität maximieren müssen, können Sie das Prototypmuster verwenden, eine leistungsstarke Variante des abstrakten Fabrikmusters

<?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());

Ergebnisse ausgeben :

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


EarthPlains Object ( )


EarthForest Object ( )

Das obige ist der detaillierte Inhalt vonImplementierungsmethode und Einführung des PHP-Prototypmodus (mit Code). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen