2009-11-30 26 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