2009-02-02 3 views

ответ

3

Как использовать шаблон Factory для возврата одного и того же экземпляра для каждого соединения, например.

ConnectionFactory::getInstance(ConnectionFactory::DEVELOPMENT); 

Возвращает Connection экземпляр для подключения к базе данных развития.

Мгновенное действие Connection должно выполняться только ConnectionFactory, которое может содержать ссылки на эти экземпляры в статическом массиве с ключом по типу подключения. Это позволяет избежать одноэлементного шаблона, но гарантирует, что вы поддерживаете только один экземпляр каждого Connection.

0

Пул соединений.

В случае Явы:

http://java.sun.com/developer/onlineTraining/Programming/JDCBook/Code/JDCConnectionPool.java

Этот пример лишний раз показывает, как вы можете реализовать его в еще лучше.

+0

Я привел пример на Java, я думаю, вы можете конвертировать то же самое на любой язык, я понимаю, что вы ожидаете его в PHP. – Techmaddy

0

Как насчет отмены шаблона Singleton, если вы хотите несколько? В последнее время Singleton стал анти-шаблоном, поэтому вы, вероятно, должны отказаться от него, даже если вам нужно одно соединение. Не говоря уже о том, что распространение Singleton на PHP довольно сложно на данный момент.

0

Как уже говорили другие, падение одиночки, то я бы, вероятно, сделать что-то вроде этого:

interface Connection_Interface 
{ 
    public function connect(); 
    public function disconnect(); 
    public function exec($sql); 
    // etc... 
} 

class Connection implements Connection_Interface 
{ 
    public function __construct($host, $username, $password, $database); 
    public function connect(); 
    public function disconnect(); 
    public function exec($sql); 
    // etc... 
} 

Затем еще один класс, который имеет несколько соединений:

class Connection_Multiple implements Connection_Interface 
{ 
    protected $_connections = array();   

    public function __construct(); 
    public function add(Connection $connection); 
    public function connect(); 
    public function disconnect(); 
    public function exec($sql) 
    { 
     // decide here which connection you want to use, then... 
     return $connection->exec($sql); 
    } 
    // etc... 
} 

Поскольку и одно соединение и несколько классов соединений реализуют один и тот же интерфейс, который вы можете использовать точно так же.

+0

Это композитный рисунок. :) –

0

Я пришел к этому решению:

class Database { 
    private static $instances = array(); 

    public static function getInstance($connection='default') { 
     if (!array_key_exists($connection,self::$instances)) { 
      self::$instances[$connection] = new Database($connection); 
     } 
     return self::$instances[$connection]; 
    } 

    private function __construct($connection) { 
     $this->credentials = // getting credentials from config by $connection... 
     $this->connect(); // connect using credentials 
    } 
} 

$DB1 = Database::getInstance('development'); 
$DB2 = Database::getInstance('production'); 

Похоже, работает для меня. Является ли это шаблоном Singleton или чем-то смешанным?

+0

Нет: singleton обеспечивает только один экземпляр класса, доступ к которому возможен глобально. Ваш дизайн ограничивает экземпляры класса, но это не всегда один и тот же экземпляр. Надеюсь, разница разная. –

Смежные вопросы