2009-02-02 75 views

回答

3

如何使用工厂模式为每个连接返回相同的实例,例如

ConnectionFactory::getInstance(ConnectionFactory::DEVELOPMENT); 

返回Connection实例用于连接到开发数据库。

Connection的实例化只能由ConnectionFactory执行,它可以将这些实例的引用保留在静态数组中,并由连接类型进行键控。这样可以避免单例模式,但可以确保只维护每个Connection的单个实例。

0

如果你想要的是多重的,那​​么放弃Singleton模式如何?最近,Singleton已经成为一种反模式,所以即使你需要单一连接,你也应该放弃它。更不用说在PHP中扩展Singleton是非常困难的。

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

这是组合模式。 :) – 2009-02-02 10:50:35

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'); 

似乎是我的作品。这是一个单例模式或混合?

+0

否:单例确保只有一个类的实例存在,可以全局访问。你的设计确实限制了这个类的实例,但它并不总是相同的实例。我希望差异是明显的。 – 2009-02-02 13:03:00