4

PHP5のファクトリメソッドパターンと組み合わせてシングルトンデザインパターンを使用するための最良の方法は何ですか?このための私の最も単純な使用シナリオは、データベースタイプごとに1回だけインスタンス化選択データベース接続です。

4

1 に答える 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 に答える