ここでは、オブジェクト指向におけるデザインパターンの1つである Factory Method パターンの PHP における実装サンプルを掲載しています。GoF によるデザインパターンが登場してから20年以上経過していますので、そろそろ現在のプログラミング言語にあわせたデザインパターンが登場するかもしれません。
スポンサーリンク
PHP による Factory Method パターンの実装サンプル
Factory Method パターン とは、オブジェクトのインスタンス生成処理とオブジェクトの利用を分離している点が特徴です。インターフェースを共通化することで、利用者は非常に直感的にプログラミングができるようになりますが、設計に失敗すると悲惨です。カオスです。
以下に、データベースの接続と切断を行う機能を持った Oracle 用と MySQL 用のクラスを Factory Method パターンでインスタンス生成を行うサンプルコードになります。詳細はサンプル内のコメントを参照ください。
// データベース接続抽象クラス
abstract class Database_Abstract
{
protected $_connection;
// データベースへの接続
abstract public function openConnection();
// データベースから切断
abstract public function closeConnection();
}
// Oracle 用抽象クラスの実装
class Oracle_Database extends Database_Abstract
{
public function openConnection()
{
// oracle データベースに接続する処理
$this->_connection = $oci_connect('パラメータ', ・・・);
}
public function closeConnection()
{
oci_close($this->_connection);
$this->_connection = null;
}
}
// MySQL 用抽象クラスの実装
class Mysql_Database extends Database_Abstract
{
public function openConnection()
{
// Mysql データベースに接続する処理
$this->_connection = mysqli_init();
mysqli_real_connect('パラメータ', ・・・);
}
public function closeConnection()
{
$this->_connection->close();
$this->_connection = null;
}
}
// Factory クラスです。このクラスメソッドを呼び出して
// 利用者はインスタンスの生成を行います
class Database_Factory
{
public static function create($db = 'Oracle')
{
// パラメータからインスタンス化するクラス名を動的に決定する
// 変数にクラス名を格納してインスタンスの生成を行うことができます
// 扱うデータベースの種類が増えてもコードを変更する必要がありません。
$db = $db . '_Database';
return new $db();
}
}
利用者側(インスタンス生成)のコード
次に利用者側のコードです。インスタンスの生成を行いデータベース接続クラスの機能を利用します。Oracle と MySQL を意識する必要はありません。ただし、現実では程度の差はありますが意識するとこもあります。また、特に設計が酷いと余計に大変なことになります。すいません、誰かさんに対する愚痴です。取り乱しました。失礼いたしました。
$db = 'Oracle'; // or 'Mysql' // インスタンス取得 $factory = Database_Factory::create($db) // データベースへ接続 $factory->openConnection(); // データベースから切断 $factory->closeConnection();