多个数据库连接类
如何使用工厂模式为每个连接返回相同的实例,例如
ConnectionFactory::getInstance(ConnectionFactory::DEVELOPMENT);
返回Connection
实例用于连接到开发数据库。
Connection
的实例化只能由ConnectionFactory
执行,它可以将这些实例的引用保留在静态数组中,并由连接类型进行键控。这样可以避免单例模式,但可以确保只维护每个Connection
的单个实例。
连接池。
在java中的情况:
http://java.sun.com/developer/onlineTraining/Programming/JDCBook/Code/JDCConnectionPool.java
这个例子只是显示方式,可以在还更好的办法实现它。
如果你想要的是多重的,那么放弃Singleton模式如何?最近,Singleton已经成为一种反模式,所以即使你需要单一连接,你也应该放弃它。更不用说在PHP中扩展Singleton是非常困难的。
正如其他人所说,下降单身的话,我可能会做这样的事情:
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...
}
同时作为单连接和多连接类实现相同的接口,您可以使用完全相同的方式。
这是组合模式。 :) – 2009-02-02 10:50:35
我想出了这个解决方案:
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');
似乎是我的作品。这是一个单例模式或混合?
否:单例确保只有一个类的实例存在,可以全局访问。你的设计确实限制了这个类的实例,但它并不总是相同的实例。我希望差异是明显的。 – 2009-02-02 13:03:00
我给了Java中的例子,我认为你可以将它转换成任何语言,我明白你期望它在PHP中。 – Techmaddy 2009-02-02 09:38:52