首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP5中与工厂模式相结合的单例

问PHP5中与工厂模式相结合的单例
EN

Stack Overflow用户
提问于 2009-11-30 14:42:30
回答 1查看 4.4K关注 0票数 4

在PHP5中结合使用单例设计模式和工厂方法模式的最佳方法是什么?我最简单的使用场景是为每种数据库类型只实例化一次选择性数据库连接。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-11-30 14:53:18

数据库连接的单例工厂:

代码语言:javascript
复制
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
            //...
        }
    }
}

用法:

代码语言:javascript
复制
$factory = DBFactory::getConnection('pdo');

不再需要单例,因为所有方法都可以静态调用……但是数据库类仍然可以被认为是单例的,因为在您的应用程序中只有一个实例。

因此,使用工厂和注册表模式也会产生相同的效果。

注册表可以通过使您的数据库类成为单例来替换,那么工厂将如下所示:

代码语言:javascript
复制
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;
    }
}

因此,您可以选择将所有DB对象设置为单例或使用注册表。我个人倾向于使用注册表,因为它可以用来存储任何类型的对象,甚至是那些你不想让类成为单例的对象。

设计的选择总是受到个人风格的影响。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1818199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档