ホームページ >バックエンド開発 >PHPチュートリアル >PHPでのファクトリーパターンの使用
ファクトリ クラスは、他のオブジェクトを作成するために特に使用されるメソッドを含むクラスを指します。ファクトリ クラスは、クラスの動的な置換や構成の変更を可能にし、一般にアプリケーションをより柔軟にします。上級 PHP 開発者にとって、ファクトリ パターンに習熟することが重要です。
ファクトリ パターンは、通常、同様のインターフェイスに準拠するさまざまなクラスを返すために使用されます。ファクトリの一般的な用途は、アプリケーション ロジックや構成設定に基づいてどのクラスをインスタンス化するかを決定できるようにすることです。このようなプロバイダーを使用すると、新しい拡張名を使用するためにアプリケーションの他の部分をリファクタリングすることなく、クラスを拡張できます。
通常、ファクトリ パターンにはキー構造があり、一般原則に従って Factory という名前の静的メソッドになります。ただし、これは単なる原則であり、この静的メソッドは任意のデータのパラメータを受け入れることもできます。そしてオブジェクトを返さなければなりません。
基本的なファクトリクラス
class MyObject{ //对象将从工厂返回 } class MyFactory{ public static function factory(){ return new MyObject(): } } $instance=MyFactory::factory();
ファクトリクラスを使用して画像ファイルを解析します
Phpコード
<?php interface IImage{ function getHeight(); function getWidth(); function getData(); } class Image_PNG implements IImage{ private $_width,$_height,$_data; public function __construct($file){ $this->_file=$file; $this->_parse(); } private function _parse(){ //完成PNG格式的解析工作 //并填充$_width,$_height,$_data; } public function getWidth(){ return $this->_width; } public function getHeight(){ return $this->_height; } public function getData(){ return $this->_data; } } class Image_JPEG implements IImage{ private $_width,$_height,$_data; public function __construct($file){ $this->_file=$file; $this->_parse(); } private function _parse(){ //完成JPEG格式的解析工作 //并填充$_width,$_height,$_data; } public function getWidth(){ return $this->_width; } public function getHeight(){ return $this->_height; } public function getData(){ return $this->_data; } } class ImageFactory{ public static function factory($file){ $pathParts=pathinfo($file); switch (strtolower($pathParts['extension'])) { case 'jpg': $ret=new Image_JPEG($file); break; case 'png': $ret=new Image_PNG($file); break; default: //有问题 } if($ret instanceof IImage){ return $ret; }else { //有问题 } } } //当使用图像文件名调用 工厂方法时,根据传入的文件类型不同,取得不同对象。
Phpコード
//调用ImageFactoyr $image=ImageFactory::factory('/path/to/my.jpg'); //$image是Image_JPEG类的一个实例 echo $image->getWidth();
データベースアプリケーションでは、ファクトリパターンを使用してデータベースの移植性の問題を解決できます。次の2つはあらゆる面で優れています。
1. ソフトウェアがさまざまなデータベース プラットフォームをサポートしやすくなり、ユーザー ベースが拡大します
2. ソフトウェアが内部で使用され、データベースを変更する必要がある場合、アプリケーションを別のプラットフォームに簡単に移行できます
コードでは、User という名前のデータベース テーブルがテスト用に作成されます。このテーブルは、email という名前の varchar 型フィールドを定義します
Php コード
<?php interface IDatabaseBindings{ public function userExists($email); } class PGSQL implements IDatabaseBindings{ protected $_connection; public function __construct(){ $this->_connection=pg_connect('dbname=example_db'); } public function userExists($email){ $emailEscaped=pg_escape_string($email); $query="select 1 from users where email='".$emailEscaped."'"; if($result=pg_query($query,$this->_connection)){ return (pg_num_rows($result)>0)?true:false; }else{ return false; } } } class MYSQL implements IDatabaseBindings{ protected $_connection; public function __construct(){ $this->_connection=mysql_connect('localhost'); mysql_select_db('example_db',$this->_connection); } public function userExists($email){ $emailEscaped=mysql_real_escape_string($email); $query="select 1 from users where email='".$emailEscaped."'"; if($result=mysql_query($query,$this->_connection)){ return (mysql_num_rows($result)>0)?true:false; }else{ return false; } } } class DatabaseFactory{ public static function factory(){ $type=loadtypefromconfigfile(); switch ($type){ case 'PGSQL': return new PGSQL(); break; case 'MYSQL': return new MYSQL(); break; } } }
アプリケーションは、接続されているデータベースの種類を知る必要はありません。 IDatabaseBindings インターフェイスによって定義されたルールに基づいて、ファクトリによって返されたインスタンスのみを直接処理します。
Php コード
//调用DatabaseFactoy $db=DatabaseFactory::factory(); $db->userExists('person@example.com');
PHP でのファクトリー パターンの使用に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。