PHP5中单例与工厂模式结合

2024-04-02

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


用于数据库连接的单例工厂:

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

usage:

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

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

在我看来,设计选择总是受到个人风格的影响。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP5中单例与工厂模式结合 的相关文章

随机推荐