質問

何が最善の方法を用シングルトンデザインパターンのファクトリメソッドのパターンにPHP5?私の最も簡単な利用シナリオのためにこのインスタンス生成の選択データベース接続に対して一回だけのデータベースタイプです。

役に立ちましたか?

解決

シングルトン工場のための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');

Singletonsん必要なのですべてのメソッドでき...そのデータベースの授業できるsingletonsでは単一のインスタンスしています。

それでは、まずはその効果を使用して作成した、工場およびレジストリ。

レジストリで置き換えることができますによるデータベースの授業singletonsその工場のようになります:

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オブジェsingletonsを利用したレジストリ。私が個人的に、レジストリで格納するために使いますのオブジェクトであっても、ものがたいへのクラスシングルトン.

デザインの選択は、常に対象個人の趣imo...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top