ホームページ >バックエンド開発 >PHPチュートリアル >PHPのシンプルファクトリパターン、ファクトリメソッドパターン、抽象ファクトリパターンの比較
PHP ファクトリ パターンの概念: ファクトリ パターンは、オブジェクトを作成する特定のメソッドを持つクラスです。 new を直接使用せずに、ファクトリ クラスを使用してオブジェクトを作成できます。このようにすると、作成されるオブジェクトのタイプを変更する場合は、ファクトリを変更するだけで済みます。このファクトリを使用するすべてのコードは自動的に変更されます。
さまざまな抽象化レベルに従って、PHP ファクトリ パターンは次のように分類されます: 単純ファクトリ パターン、ファクトリ メソッド パターン、および抽象ファクトリ パターン
単純なファクトリ パターン:
/******コードには元のテキストまたは git ****** に osgit アドレスが含まれています*/
/** *简单工厂模式与工厂方法模式比较。 *简单工厂又叫静态工厂方法模式,这样理解可以确定,简单工厂模式是通过一个静态方法创建对象的。 */interface people {function jiehun();}class man implements people{function jiehun() { echo '送玫瑰,送戒指!<br>';}} class women implements people {function jiehun() { echo '穿婚纱!<br>';}} class SimpleFactoty {// 简单工厂里的静态方法static function createMan() {return new man;}static function createWomen() {return new women;}} $man = SimpleFactoty::createMan();$man->jiehun();$man = SimpleFactoty::createWomen();$man->jiehun();
ファクトリ メソッド パターン:
<?php/* *工厂方法模式: *定义一个创建对象的接口,让子类决定哪个类实例化。 他可以解决简单工厂模式中的封闭开放原则问题。<www.phpddt.com整理> */interface people {function jiehun();}class man implements people{function jiehun() { echo '送玫瑰,送戒指!<br>';}} class women implements people {function jiehun() { echo '穿婚纱!<br>';}} interface createMan { // 注意了,这里是简单工厂本质区别所在,将对象的创建抽象成一个接口。function create(); }class FactoryMan implements createMan{function create() {return new man;}}class FactoryWomen implements createMan {function create() {return new women;}} class Client {// 简单工厂里的静态方法function test() { $Factory = new FactoryMan; $man = $Factory->create(); $man->jiehun(); $Factory = new FactoryWomen; $man = $Factory->create(); $man->jiehun();}} $f = new Client;$f->test();
抽象ファクトリー パターン:
<?php/*抽象工厂:提供一个创建一系列相关或相互依赖对象的接口。 注意:这里和工厂方法的区别是:一系列,而工厂方法则是一个。那么,我们是否就可以想到在接口create里再增加创建“一系列”对象的方法呢?*/interface people {function jiehun();}class Oman implements people{function jiehun() { echo '美女,我送你玫瑰和戒指!<br>';}}class Iman implements people{function jiehun() { echo '我偷偷喜欢你<br>';}} class Owomen implements people {function jiehun() { echo '我要穿婚纱!<br>';}} class Iwomen implements people {function jiehun() { echo '我好害羞哦!!<br>';}} interface createMan { // 注意了,这里是本质区别所在,将对象的创建抽象成一个接口。function createOpen(); //分为 内敛的和外向的function createIntro(); //内向 }class FactoryMan implements createMan{function createOpen() {return new Oman;}function createIntro() {return new Iman;}}class FactoryWomen implements createMan {function createOpen() {return new Owomen;}function createIntro() {return new Iwomen;}} class Client {// 简单工厂里的静态方法function test() { $Factory = new FactoryMan; $man = $Factory->createOpen(); $man->jiehun(); $man = $Factory->createIntro(); $man->jiehun(); $Factory = new FactoryWomen; $man = $Factory->createOpen(); $man->jiehun(); $man = $Factory->createIntro(); $man->jiehun();}} $f = new Client;$f->test();
違い:
シンプルファクトリーモード: 同じレベル構造で任意の製品を生産するために使用されます。新しい製品の追加については何もできません。
ファクトリー モード: 同じ階層構造で固定された製品を生産するために使用されます。 (任意の製品の追加をサポート)
抽象ファクトリー: さまざまな製品ファミリーのすべての製品を生産するために使用されます。 (新しい製品の追加については何もできません。製品ファミリーの追加はサポートされています)
上記の 3 つのファクトリ メソッドは、階層構造と製品ファミリーの 2 つの方向で異なるサポート レベルを持っています。状況に応じてどのメソッドを使用するかを検討してください。
適用範囲:
単純なファクトリ パターン:
ファクトリ クラスが作成を担当します。オブジェクトの数が減ります。クライアントはファクトリ クラスに渡されるパラメータのみを認識し、オブジェクトの作成方法については考慮しません。
ファクトリ メソッド パターン:
クラスが作成する必要があるオブジェクトのクラスを知らない場合、またはクラスが作成するオブジェクトをサブクラスに指定する必要がある場合、クラスがオブジェクトを作成するとき複数のヘルパー サブクラスの 1 つに責任を委任し、どのヘルパー サブクラスがデリゲートであるかに関する情報をローカライズする場合は、ファクトリ メソッド パターンを使用します。
抽象ファクトリ パターン:
システムは、製品クラスのインスタンスがどのように作成、構成、表現されるかという詳細に依存すべきではありません。これは、あらゆる形式のファクトリ パターンにとって重要です。このシステムには複数の製品ファミリーがあり、システムはそのうちの 1 つの製品ファミリーのみを使用します。同じ製品ファミリに属する製品は一緒に使用されるため、この制約をシステム設計に反映する必要があります。システムは製品クラス ライブラリを提供し、すべての製品は同じインターフェイスで表示されるため、クライアントは実装に依存しません。
単純なファクトリ パターン、ファクトリ パターン、または抽象ファクトリ パターンのいずれであっても、基本的に不変部分を抽出し、可変部分をインターフェイスとして残し、最大限の再利用を実現します。どの設計パターンがより適しているかは、特定のビジネス ニーズによって異なります。