2009-11-30 32 views
4

在PHP5中將單身人士設計模式與工廠方法模式結合使用的最佳方法是什麼?我最簡單的使用場景是每個數據庫類型僅實例化選擇性數據庫連接一次。在PHP5中與工廠模式結合的單身人士

+0

您是否在尋找示例實現或實現這些模式的方法? – NDM 2009-11-30 06:49:05

+0

不,我正在尋找有效的(在速度方面)這些模式的實現。我知道沒有什麼特定的答案,但我相信最好的方法來改進某些東西,學習別人的做法。 – 2009-11-30 09:39:45

回答

10

單工廠DB連接:

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

用法:

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

單身是不是真的需要了,因爲所有的方法都可以靜態調用... 但數據庫類尚可被認爲是單身人士,因爲在你的應用程序中只有一個實例。

因此,通過使用工廠和註冊表模式創建相同的效果。

註冊表可以通過使您的數據庫類單身然後工廠看起來像這樣被替換:

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

所以,你必須讓所有的數據庫的選擇對象,單身或使用註冊表。我個人會使用註冊表,因爲它可以用來存儲任何類型的對象,即使是不想讓該類成爲單例的對象。

設計選擇總是受到個人風格的影響...

+0

雖然單身人士比老派靜態班學習得多l33t,但是: - ] – Atli 2009-11-30 06:59:26

+0

,因爲他們是「l337」,你會在不需要他們的地方使用它們嗎? – NDM 2009-11-30 08:16:26

+0

當然沒有。比其他任何事情都更像是一個笑話。不過,我不得不懷疑,如果有的話,這兩種方法在性能方面的區別究竟如何。 - 必須對此進行一些研究。 – Atli 2009-11-30 09:24:42