2012-01-21 36 views
0

我想知道,这是一个“不健康的”使用工厂模式,或者如果它是完全合理的:'不健康'使用工厂模式?

<?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课程的'纯粹'。也许我在想太多。

我的用法来自有许多类,使数据库交易。在所有的例子中,我看到用户名/密码/主机/ etc在每次使用时都被重写了,这看起来并不像OOP那样。

值得一提的是,我真的更喜欢使用Singleton,这让我觉得这是一个绝好的机会(只需要一个连接就可以提高性能,但据我了解),但我是试图避免诱惑,因为我听说他们被认为是OOP癌症。

也许问题是我不应该在这么多地方使用mysqli类,并且可能会使用静态'do query'函数或类似的类来使用类。关于这个问题的所有想法都很受欢迎

回答

0

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

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

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

虽然有一个mysqli代理对象,而不是直接mysqli交互实际上不会实现数据库不可知论它有其他好处。自定义查询日志记录,SQL健全性检查,分片逻辑以及其他一些事情可能会在您的瘦分包装中一直存在。我说写你的代理对象,并在一些静态变量或单身的地方实例化它,并称它为好。 OOP纳粹分子可以继续辩论其完美,而你正在转向更重要的事情。

+0

你说得对,这是对一个简单问题的过度渴望......我主要试图巩固我的OOP原则。 我不在寻找PDO类型的解决方案(我没有用于访问抽象),所以如果我的代码给出了这样的印象,我很抱歉。 大部分我正在寻找的是一种“模板化”我的访问类型的方法......而不必在整个地方重新写入用户名/密码。我注意到mysqli能够将'默认'数据存储在INI文件中。这不是一个巨大的安全问题吗? – 1owk3y