ホームページ >バックエンド開発 >PHPチュートリアル >PHP デザイン パターン ファクトリ パターンの学習ノート_PHP チュートリアル

PHP デザイン パターン ファクトリ パターンの学習ノート_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 17:15:411085ブラウズ

この記事では、php5 の新しい機能であるファクトリー モードを紹介します。ここでは、私がよく使用するファクトリー モードについての学習メモをいくつか紹介します。詳細を知りたい友人の参考にさせていただきます。

大規模なシステムでは、多くのコードがいくつかの主要なクラスに依存しています。これらのクラスを変更する必要がある場合、問題が発生する可能性があります。たとえば、ファイルから読み取る User クラスがあるとします。これをデータベースから読み取る別のクラスに変更したいと考えていますが、コードはすべてファイルから読み取る元のクラスを参照しています。このとき、ファクトリーモードを使用すると非常に便利です。

ファクトリ パターンは、オブジェクトを作成する特定のメソッドを持つクラスです。 new を直接使用せずに、ファクトリ クラスを使用してオブジェクトを作成できます。このようにすると、作成されるオブジェクトのタイプを変更する場合は、ファクトリを変更するだけで済みます。このファクトリを使用するすべてのコードは自動的に変更されます。

例1: ファクトリクラスの列を表示します。

この方程式のサーバー側は 2 つの部分で構成されます: データベースと、フィードバックの追加、フィードバック リストのリクエスト、特定のフィードバックに関連する記事の取得を可能にする一連の PHP ページです

コードは次のとおりです コードをコピー

インターフェイス IUser
{
関数 getName();
}
ユーザーが IUser を実装するクラス
{
パブリック関数 __construct( $id ) { }
パブリック関数 getName()
{
「ジャック」を返します;
}
}
クラスUserFactory
{
パブリック静的関数 Create( $id )
{
新しいユーザー( $id )を返します;
}
}
$uo = UserFactory::Create( 1 );
echo( $uo->getName()."n" );
?>

IUser インターフェイスは、ユーザー オブジェクトが実行する必要がある操作を定義します。 IUser の実装は User と呼ばれ、UserFactory ファクトリ クラスが IUser オブジェクトを作成します。この関係は、図 1 の UML で表すことができます。


図 1. ファクトリ クラスとそれに関連する IUser インターフェイスとユーザー クラス

php インタープリターを使用してコマンドラインでこのコードを実行すると、次の結果が得られます。

% php Factory1.php

ジャック
%

テストコードはファクトリからUserオブジェクトをリクエストし、getNameメソッドの結果を出力します。

ファクトリーメソッドを使用するファクトリーパターンのバリエーションがあります。クラス内のこれらのパブリック静的メソッドは、その型のオブジェクトを構築します。このメソッドは、このタイプのオブジェクトを作成することが重要な場合に役立ちます。たとえば、オブジェクトを作成し、いくつかのプロパティを設定する必要があるとします。このバージョンのファクトリ パターンはプロセスを 1 か所にカプセル化するため、複雑な初期化コードをコピーしてコード ベース全体に貼り付ける必要がありません。

例 2 は、ファクトリ メソッドの使用例を示しています。

コードは次のとおりですコードをコピー


さて、上でたくさん話しましたが、例を見てみましょう

以下の4つのファイルを作成します

index.php

インターフェイス IUser
{
関数 getName();
}
ユーザーが IUser を実装するクラス
{
パブリック静的関数 Load( $id )
{
return 新しいユーザー( $id );
}
パブリック静的関数 Create( )
{
return new User( null );
}
パブリック関数 __construct( $id ) { }
パブリック関数 getName()
{
「ジャック」を返します;
}
}
$uo = ユーザー::Load( 1 );
echo( $uo->getName()."n" );
?>
コードは次のとおりです コードをコピー

include_once("f.inc.php");
$f=新しい工場;
$t1=&$f->create('T1');
echo $t1->getName();
echo $config;
?>

f.inc.php

コードは次のとおりです コードをコピー

クラスファクトリー
{
関数ファクトリー()
{
$this->mClasses=array('T1'=>'t1.inc.php','T2'=>'t2.inc.php');
}
関数&create($class)
{
if (!class_exists($class))
{
require_once($this->mClasses[$class]);
}
新しい $class を返します;
}
}
?>

t1.inc.php

コードは次のとおりです コードをコピー

グローバル $config;
$config='サーフチェン';
クラスT1
{
var $mName='名前::T1';
関数getName()
{
$this->mName;
を返します }
}
?>

t2.inc.php

コードは次のとおりです コードをコピー

クラスT2
{
関数 T2()
{
echo 't2 は OK';
}
}
?>

index.php では、ファクトリ クラスを通じて他のクラスのインスタンスを作成します。
ファクトリには、array("クラス名" => "クラスファイルパス") の形式で保存された配列 $this->mClasses があります。
Factory::create() でクラス インスタンスを作成すると、create() でまずクラスが存在するかどうかがチェックされ、存在しない場合は、$this-> に従ってそのクラスに対応するクラス ファイルがインクルードされます。 mクラス。次に、このクラスのインスタンスを作成して返します。

この方法では、実行するスクリプト (index.php など) にファクトリ クラス ファイルを含めるだけで済みます。

t1.inc.php の次の 2 行のコードにも注目してください。

コードは次のとおりです コードをコピー
グローバル $config;
$config='サーフチェン';

なぜグローバルが必要なのでしょうか? t1.inc.php は Factory::create に含まれているため、t1 ファイル内の変数はデフォルトで create の関数レベル変数になります。したがって、変数 ($config など) をグローバルにして、index.php が変数にアクセスできるようにする必要があります。

index.phpを実行すると出力されます

コードは次のとおりです コードをコピー
名前::T1surfchen

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/628801.html技術記事この記事では、php5 の新しい機能であるファクトリー モードを紹介します。ここでは、私がよく使用するファクトリー モードについての学習メモをいくつか紹介します。詳細を知りたい友人と共有します。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。