单身人士是微博网站的好设计模式吗?

时间:2010-10-06 08:22:24

标签: php mysql design-patterns singleton pdo

我过去没有在项目中使用任何OO,因为我保持简单(事实上使用古老的mysql_query调用和我自己的过滤),所以我想开始一个新项目,学习使用我的OO设计模式一路上。

我正在寻找建立一个微博的网站,并找到了singleton design pattern类似乎完整,并与PDO一起使用我看不出它有什么问题(除了不能访问两个数据库,我不确定这个项目是否需要。)

说这样的项目,或简单的CMS软件,单身是个好主意吗?什么样的设计模式/数据库类类型将“大家伙”用于这些事情,如果它被升级(并发连接/性能),这将在以后限制太多吗?

我还读过有关工厂单例来处理稍后处理额外连接的问题,因为更改其中的代码更简单。这会解决任何负面问题并使其成为更合适的设计模式吗?

3 个答案:

答案 0 :(得分:3)

Singleton的目的是将对象实例限制为一个并提供全局访问 两者都是你不想要或不需要的东西。

在PHP中将实例限制为一个实例是毫无意义的,其中此限制仅适用于当前请求中的实例。如果两个请求同时到达您的微博网站,则每个请求仍然会有一个实例。如果要确保只有实例,只需不实例化第二个实例。

全局访问也不是你想要的,因为它破坏了封装。如果您需要对象中的某个实例,请通过dependency injection传递。这是干净和可维护的。它还有一个额外的好处,即允许您轻松地与其他实现交换依赖关系,例如mock classesunit tests

即使Erich Gamma,Singleton模式的发明者之一,现在质疑这种模式:

  

"I'm in favor of dropping Singleton. Its use is almost always a design smell"

你最好避开单身人士。

答案 1 :(得分:2)

如果我没弄错,单身是antipattern。但是根据任务可以使用它。

答案 2 :(得分:0)

如前所述,单身人士对您的博客应用程序的帮助不大。只需创建一个数据库实例并使用它即可。

Sidenode,你在PHP中看到的往往是“假单身人士”。如果实现为普通类,则通常涉及使用实现单例解决方法的::getInstance()方法。然而,类的存在允许实例化多个项(new Singleton()&& new Singleton())。因此,我推荐一个程序单例,它没有这个问题,而且眼睛也更好:

 function db() {
     static $db;
     if (!isset($db)) {
          $db = new PDO("sqlite:memory");
     }
     return $db;
 }

这样您可以使用db()->query("SELECT * FROM blog")并避免始终导入全局$ db var。