';不健康';工厂模式的使用


'Unwholesome' use of factory pattern?

我想知道这是对工厂模式的"不健康"使用,还是完全合理:

<?php //ConnectionFactory.class.php
    /**
     * Generates prepared mysqli connection instances
     */
    class ConnectionFactory {
        public static function make(){
            $c = new mysqli('localhost', 'testusername', 'fakepassword');
            if ($c->connect_error) throw new ConnectionException("Connection failed");
            return $c;
        }
    }
    class ConnectionException extends Exception {}
?>

或者,用预先填充的参数扩展mysqli类会更合适吗?我曾想过这样做,但这感觉违反了mysqli类的"纯洁性"。也许我想得太多了。

我的用法来自于拥有许多生成数据库事务的类。在我看到的所有例子中,用户名/密码/主机等都在每次使用时重新编写,这似乎也不太像OOP。

值得注意的是,我真的更喜欢使用Singleton,这对我来说是一个完美的机会(只需要一个连接,据我所知,这将是一个巨大的性能提升),但我正在努力避免这种诱惑,因为我听说它们被认为是OOP癌症。

也许问题是我不应该在这么多地方使用mysqli类,而应该使用一个带有静态"do query"函数或类似函数的类。关于这个主题的所有想法都得到了高度评价。

您过度分析了问题。如果你不能决定数据库连接的完美实现,你将永远无法完成任何事情。

这可能是单例有意义的情况,因为确保每个进程只有一个连接是开放的比深奥的OOP准则重要得多。

听起来你正在考虑编写一个瘦数据库抽象,虽然我认为这可能比你的代码直接处理mysqli对象要好一点,但你应该意识到这是一个老生常谈的领域。如果你真的想成为数据库不可知论者,不要重新发明轮子。。。只需使用PDO或其他一些DB抽象或映射工具。

虽然使用mysqli代理对象而不是直接的mysqli交互实际上不会实现数据库无关性,但它还有其他好处。自定义查询日志记录、SQL健全性检查、分片逻辑和许多其他东西都可以在以后的瘦数据库包装中使用。我说,编写您的代理对象,并在某个静态变量或singleton中实例化它,然后称之为good。OOP纳粹分子可以继续争论它的完美性,而你可以继续做更重要的事情。