この記事は、PHPプロトタイプモードの実装方法と紹介(コード付き)を紹介するもので、一定の参考価値がありますので、困っている方は参考にしていただければ幸いです。
プロトタイプ インスタンスを使用して、作成するオブジェクトのタイプを指定し、これらのプロトタイプをコピーして新しいオブジェクトを作成します。
並列継承階層の出現は、次のとおりです。ファクトリメソッドパターンによってもたらされる質問。これは一部のプログラマにとって不快な結合です。製品ファミリーを追加するたびに、関連する特定のクリエーターを作成する必要があります。ますます多くの製品を含む急速に成長するシステムでは、これらの関係を維持することがすぐに面倒になる可能性があります。
この依存関係を回避する方法は、PHP の clone キーワードを使用して既存の特定の製品をコピーすることで、特定の製品カテゴリ自体が独自の生成の基礎になります。これがプロトタイプモードです。このパターンを使用すると、継承の代わりに合成を使用できます。このような変更により、コードの実行時の柔軟性が向上し、作成する必要があるクラスの数が減少します。
戦闘ユニットをブロックで構成されたグリッド内で操作できる「シヴィライゼーション」スタイルのオンライン ゲームがあるとします。各ブロックは海、平原、森を表します。地形の種類によって、ブロックを占領しているユニットの戦闘能力が制限されます。 Sea、Forest、Plains オブジェクトを提供する terrainFactory オブジェクトを用意することができ、ユーザーが完全に異なる環境から選択できるようにすることで、Sea を Marssea と Earthsea の抽象親クラスにできるようにしました。 Forest オブジェクトと P1ains オブジェクトも同様の実装になります。ここでのブランチは、抽象ファクトリー パターンを構成します。私たちはまったく異なる製品システム (海、平原、森林) を持っており、これらの製品ファミリーは継承を超えた密接な関係があります。たとえば、地球と火星にはどちらも海、森林、平野の地形があります。図 9-10 に示すクラス図は、これらの製品に Abstract Factory および Factory Method パターンを適用する方法を示しています。
ご覧のとおり、ファクトリによって生成されたテレイン (地形) ファミリ プロダクトを結合するために継承に依存しています。これは確かに実現可能なソリューションですが、大規模な継承システムが必要であり、比較的扱いにくいです。非常に柔軟です。 。並列統合システムは必要ないが、実行時の柔軟性を最大限に高める必要がある場合は、抽象ファクトリ パターンの強力なバリアントであるプロトタイプ パターン
<?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 オブジェクト ([navigability:Sea:private] => -1 )
EarthPlains オブジェクト ( )
EarthForest オブジェクト ( )
以上がPHPプロトタイプモードの実装方法と紹介(コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。