2009-02-02 3 views
3

싱글 톤 패턴을 사용하여 여러 DB 연결을 만드는 방법은 무엇입니까? 아니면 동일한 클래스를 사용하지만 여러 연결을 공유하는 것이 더 나은 방법일까요?여러 DB 연결 클래스

답변

3

방법 공장 패턴을 사용하여 각각의 연결에 대해 동일한 인스턴스를 반환에 대해, 예를 들어

ConnectionFactory::getInstance(ConnectionFactory::DEVELOPMENT); 

개발 데이터베이스에 연결하기 위해 Connection 인스턴스를 반환합니다.

Connection의 인스턴스화는 ConnectionFactory에 의해서만 수행되어야하며, 이는 연결 유형으로 고정 된 정적 배열의 인스턴스에 대한 참조를 유지할 수 있습니다. 이렇게하면 싱글 톤 패턴을 피할 수 있지만 각 Connection의 단일 인스턴스 만 유지할 수 있습니다.

0

어떻게 당신이 원하는 여러 경우 싱글 톤 패턴을 삭제 어떻습니까? 최근 Singleton은 anti-pattern으로 변 했으므로 단일 연결이 필요한 경우에도 삭제해야합니다. 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

이것은 복합 패턴입니다. :) –

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

아니요 : 싱글 톤은 전역으로 액세스 할 수있는 클래스 인스턴스가 하나만 존재하도록합니다. 디자인은 클래스의 인스턴스를 제한하지만 항상 동일한 인스턴스는 아닙니다. 그 차이가 뚜렷하기를 바랍니다. –