Maison  >  Article  >  développement back-end  >  Méthode d'implémentation et introduction du mode prototype PHP (avec code)

Méthode d'implémentation et introduction du mode prototype PHP (avec code)

不言
不言avant
2019-02-18 14:29:182350parcourir

Le contenu de cet article concerne la méthode d'implémentation et l'introduction du mode prototype PHP (avec code). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Utilisez des instances de prototypes pour spécifier les types d'objets à créer, et créez de nouveaux objets en copiant ces prototypes

L'émergence de la hiérarchie d'héritage parallèle est provoqué par le modèle de méthode d'usine une question. Il s’agit d’un couplage qui met certains programmeurs mal à l’aise. Chaque fois que vous ajoutez une famille de produits, vous êtes obligé de créer un créateur spécifique associé. Dans un système en croissance rapide qui comprend de plus en plus de produits, entretenir ces relations peut vite devenir fastidieux.
Le moyen d'éviter cette dépendance est d'utiliser le mot-clé clone de PHP pour copier un produit spécifique existant. Ensuite, les catégories de produits spécifiques elles-mêmes deviennent la base de leur propre génération. C'est le mode prototype. En utilisant ce modèle, nous pouvons utiliser la composition au lieu de l'héritage. Un tel changement favorise la flexibilité de l'exécution du code et réduit le nombre de classes à créer.

Supposons qu'il existe un jeu en ligne de style "Civilisation" dans lequel les unités de combat peuvent être exploitées dans une grille composée de blocs. Chaque bloc représente un océan, une plaine et une forêt. Le type de terrain restreint la capacité de combat de l'unité occupant le bloc. Nous pourrions avoir un objet terrainFactory qui fournit des objets Sea, Forest et Plains. Nous avons décidé de permettre à l'utilisateur de choisir entre des environnements complètement différents, afin que Sea puisse être une classe parent abstraite pour Marssea et Earthsea. Les objets Forest et P1ains auront des implémentations similaires. Les branches constituent ici le motif abstrait de l’usine. Nous avons des systèmes de produits complètement différents (mer, plaines, forêts), et ces familles de produits ont des liens étroits au-delà de l'héritage, comme la Terre et Mars, qui possèdent toutes deux des océans, des forêts et des plaines. Le diagramme de classes présenté dans la figure 9-10 montre comment appliquer les modèles Abstract Factory et Factory Method à ces produits.

Comme vous pouvez le constater, nous nous appuyons sur l'héritage pour combiner les produits de la famille terrain (terrain) générés par l'usine. C'est effectivement une solution réalisable, mais elle nécessite un système d'héritage important et est relativement lourde à manier. . Lorsque vous ne souhaitez pas d'un système d'intégration parallèle mais que vous avez besoin de maximiser la flexibilité d'exécution, vous pouvez utiliser la puissante variante du modèle d'usine abstraite - le modèle prototype

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

pour afficher les résultats :

Objet EarthSea ( [navigabilité:Mer:private] => -1 )


Objet EarthPlains ( )


Objet EarthForest ( )

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer