PHP5 Factory Pattern ile Bağlaç Singleton

1 Cevap php

PHP5 fabrika yöntemi deseni ile birlikte singleton tasarım deseni kullanarak için en iyi yöntemi nedir? Bunun için benim basit kullanım senaryosu her veritabanı türü için sadece bir kez örnekleme seçici veritabanı bağlantısıdır.

1 Cevap

DB bağlantısı için tekil fabrika:

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
            //...
        }
    }
}

kullanımı:

$factory = DBFactory::getConnection('pdo');

Singletons are not really needed anymore because all methods can be called statically... But the database classes can still be considered singletons because there will only be one single instance of them in your application.

Yani aynı etki fabrika ve kayıt desenleri kullanılarak oluşturulur.

Kayıt defteri veritabanı sınıfları singletons yaparak yerini olabilir sonra fabrika bu gibi görünecektir:

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;
    }
}

Yani tüm DB singletons nesneleri yapmak veya bir kayıt defteri kullanarak seçim var. Bu size sınıf bir singleton yapmak istemiyorum bile olanları nesnenin herhangi türlerini depolamak için kullanılabilir, çünkü ben şahsen bir kayıt defteri ile gider.

Tasarım seçenekleri her zaman imo kişisel lezzet tabi tutulur ...