'不卫生'使用工厂模式?

时间:2012-01-21 13:07:47

标签: php mysql oop 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'函数的类或类似的东西。所有关于这个主题的想法都很受欢迎

1 个答案:

答案 0 :(得分:0)

你正在分析这个问题。如果您无法确定数据库连接的完美实现,那么您将永远无法完成任何工作。

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

听起来你正在考虑编写一个精简的数据库抽象,虽然我认为这可能比直接使用mysqli对象的代码要好一点,但你应该知道这是一个很好的领域。如果你真的想成为数据库无关,不要重新发明轮子......只需使用PDO或其他一些数据库抽象或映射工具。

虽然拥有一个mysqli代理对象而不是直接的mysqli交互实际上不会实现db不可知论,但它确实有其他好处。自定义查询日志记录,SQL健全性检查,分片逻辑以及许多其他内容都可以存储在您的瘦数据库包装器中。我说编写你的代理对象并在某个静态变量或单例中实例化它并调用它。当你转向更重要的事情时,OOP纳粹可以继续辩论它的完美。