PHP5のファクトリメソッドパターンと組み合わせてシングルトンデザインパターンを使用するための最良の方法は何ですか?このための私の最も単純な使用シナリオは、データベースタイプごとに1回だけインスタンス化選択データベース接続です。
4415 次
1 に答える
10
DB接続用のシングルトンファクトリ:
class Registry
{
private static $_objects;
public static function set($key, $object)
{
if (!array_key_exists($key, self::$_objects)) self::$_objects[$key] = $object;
}
public static function get($key)
{
if (array_key_exists($key, self::$_objects)) return self::$_objects[$key];
else return false;
}
}
class DBFactory
{
public static function getConnection($type)
{
switch ($type) {
case 'pdo':
if (!(Registry::get('DB_PDO') instaceof DbPdo)) Registry::set('DB_PDO', new DbPdo('user', 'pass', ...));
return Registry::get('DB_PDO')
case 'mssql':
//same for other connections
//...
}
}
}
利用方法:
$factory = DBFactory::getConnection('pdo');
すべてのメソッドを静的に呼び出すことができるため、シングルトンは実際には必要ありません...ただし、アプリケーションにはデータベースクラスのインスタンスが1つしかないため、データベースクラスはシングルトンと見なすことができます。
したがって、ファクトリパターンとレジストリパターンを使用しても同じ効果が得られます。
レジストリは、データベースクラスをシングルトンにすることで置き換えることができ、ファクトリは次のようになります。
class DBFactory
{
public static function getConnection($type)
{
switch ($type) {
case 'pdo':
return DbPdo::getInstance('user', 'pass', ...);
case 'mssql':
//same for other connections
//...
}
}
}
class DbPdo
{
private static $_instance;
private function __construct($user, $pass, ...){ //instantiate object }
public static function getInstance($user = null, $pass = null, ...)
{
if (!(self::$_instance instanceof DbPdo)) self::$_instance = new DbPdo($user, $pass, ...);
return self::$_instance;
}
}
したがって、すべてのDBオブジェクトをシングルトンにするか、レジストリを使用するかを選択できます。クラスをシングルトンにしたくないオブジェクトも含め、あらゆるタイプのオブジェクトを格納するために使用できるため、私は個人的にレジストリを使用します。
デザインの選択は常に個人的なフレーバーの影響を受けます...
于 2009-11-30T06:53:17.657 に答える