ホームページ >バックエンド開発 >PHPチュートリアル >PHP のファクトリーパターンを理解する

PHP のファクトリーパターンを理解する

高洛峰
高洛峰オリジナル
2016-12-17 10:53:401172ブラウズ

ファクトリ クラスは、他のオブジェクトを作成するために特別に使用されるクラスです。ファクトリ クラスは、ポリモーフィック プログラミングの実践において非常に重要です。これにより、クラスの動的な置換や構成の変更が可能になり、アプリケーションがより柔軟になります。ファクトリ パターンを習得することは Web 開発にとって不可欠です。

ファクトリ パターンは、通常、インターフェイスと同様のさまざまなクラスを返すために使用されます。ファクトリの一般的な用途は、多態性プロバイダーを作成することです。

通常、ファクトリ パターンにはキー構造があり、これは一般にファクトリという名前の静的メソッドです。この静的メソッドは任意の数のパラメータを受け入れることができ、オブジェクトを返す必要があります。

プログラムリスト: 基本ファクトリークラス

class Fruit {
// ファクトリクラスから返されるオブジェクト
}

Class FruitFactory {

public static function Factory() {
// のいずれかを返しますオブジェクト 新しいインスタンス
return new Fruit();
}
}

// ファクトリーを呼び出す
$instance = FruitFactory::factory();
?>

プログラムリスト: ファクトリクラスを使用してオブジェクトを生成します

< ;? php
class Example
{
// パラメータ化されたファクトリメソッド
public static function Factory($type)
{
if (include_once 'Drivers/' . $type . '.php') {
$classname = 'Driver_ ' . $type;
return new $classname;
// SQLite ドライバーをロードします
$sqlite = Example::factory('SQLite');
?>


プログラムリスト: A完全なファクトリ クラス

次のプログラムは、一般的なファクトリ クラスを定義します。すべての操作を保存できる空のオブジェクトが生成され、インスタンスを取得できます。これらの操作はすべてそのインスタンス内にあります。


/**
* 一般的な Factory クラス
*
* この Magic Factory は、それに対して実行されるすべての操作を記憶します
* そして、それらをインスタンス化するオブジェクトに適用します。
*
   */
class FruitFactory {
private $history, $class, $constructor_args;

/**
* 指定されたクラスのファクトリーを作成します。渡される追加の引数を受け入れます
* クラス コンストラクター
       */
__ construct( $class ) {
$ args = func_get_args();
$this->class = $class;
$this->constructor_args = array_slice( $args, 1 );
}

function __call( $method, $args ) {
$this ->history[] = array(
'アクション' =>> '呼び出し',
'メソッド' => $method,
'args' => $args
);
}

function __set( $ property, $value ) {
$this->history[] = array(
'action' =>> 'set',
'property' => $property,
'値' => $値
) ;
}

/**
* インスタンスを作成し、この MagicFactory で行われたすべての操作を実行します
       */
functioninstance() {
# $args を使用して Reflection を使用して新しいインスタンスを作成します
$reflection_object = new lectionClass( $this->class );
$object = $reflection_object->newInstanceArgs( $this->constructor_args );

# ReflectionClass を使用しないが変数をサポートしない代替メソッド
# コンストラクターパラメータの数
//$object = new $this->class();

# 記憶されているすべての操作を繰り返し、適用します新しいオブジェクトへ
foreach( $this->history as $item ) {
if( $item['action'] == 'call' ) {
call_user_func_array( array( $object['method, '] ), $item['args'] );
}
if( $item['action'] == 'set' ) {
$object->{$item['property']} = $item[' value'];
}
}

# Done
return $object;
}
}

class Fruit {
private $name, $color;
public $price;

function __construct( $name, $color ) {
$this->name = $name;
$this->color = $color;
}

function setName( $name ) {
$this->name = $name;
} }

function recruit() {
print "こんにちは、これは {$this->name} {$this->sirname} です、価格は {$ this -& gt; 価格} rmb. ";;
}}}
# 派閥を設定します
$ Fruit_Factory = New FruitFactory ('FRUIT', 'Apple', 'Gonn'); -& gt; setname ('Apple' );
$fruit_factory->price = 2;

# インスタンスを取得します
$apple = $fruit_factory->instance();
$apple->introduce();
?>


プログラム実行結果:

こんにちは、これは Apple です。価格は 2 RMB です

ファクトリ パターンは、目的を達成するためにオブジェクトを作成する特定のプロセスを保護および分離するために、主にオブジェクトを作成するための遷移インターフェイスを提供します。柔軟性の向上。

ファクトリー パターンは 3 つのカテゴリに分類できます:

単純なファクトリー

ファクトリー メソッド

抽象ファクトリー

これら 3 つのパターンは、上から下へ、より一般的には徐々に抽象化されます。

単純なファクトリ パターンは、静的ファクトリ メソッド パターンとも呼ばれます。名前の変更から、このモードは非常に単純であることがわかります。その目的は単純で、オブジェクトを作成するためのインターフェイスを定義することです。ファクトリ メソッド パターンは、単純なファクトリ パターン内のファクトリ メソッドの静的属性を削除し、サブクラスに継承できるようにします。このようにして、単純なファクトリ パターンでファクトリ メソッドに集中した圧力を、ファクトリ メソッド パターンの異なるファクトリ サブクラスで共有できます。

ファクトリ メソッド パターンはオブジェクトの作成を完全にパッケージ化しているように見えるため、クライアント プログラムは抽象的な製品ロールによって提供されるインターフェイスのみを処理します。では、コード全体にファクトリーを配置する必要があるのでしょうか?する必要がない。おそらく、次の状況でファクトリ メソッド パターンの使用を検討できます:

クライアント プログラムが使用するオブジェクトの作成プロセスを知る必要がない場合。

クライアント プログラムで使用されるオブジェクトが変更される場合や、どの特定のオブジェクトを使用すればよいかまったくわからない場合があります。


PHP のファクトリー パターン Factory Pattern の理解に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。