我知道这已经很老了,但Dr8k的答案几乎就在那里。
当您考虑编写一段代码时,假设它将发生变化。这并不意味着你假设它将在将来的某个时候对它进行什么样的改变,而是假设会做出某种形式的改变。
让它成为一个目标,减轻未来做出改变的痛苦:一个全球是危险的,因为它很难在一个地方进行管理。如果将来我想使该数据库连接上下文感知,该怎么办?如果我希望它关闭并每5次使用一次重新打开,该怎么办?如果我决定为了扩展我的应用而决定使用包含 10 个连接的池,该怎么办?还是可配置的连接数?
单例工厂为您提供了这种灵活性。我设置它几乎没有额外的复杂性,并且获得的不仅仅是访问同一连接;我获得了以后以简单的方式更改该连接传递给我的方式的能力。
请注意,我说的是单例工厂,而不是简单的单例。单例和全局之间几乎没有什么区别,真的。正因为如此,没有理由拥有单例连接:当您可以创建常规全局时,为什么要花时间进行设置呢?
工厂给你的是一个为什么获得连接,以及一个单独的点来决定你将获得哪些连接(或连接)。
例
class ConnectionFactory
{
private static $factory;
private $db;
public static function getFactory()
{
if (!self::$factory)
self::$factory = new ConnectionFactory(...);
return self::$factory;
}
public function getConnection() {
if (!$this->db)
$this->db = new PDO(...);
return $this->db;
}
}
function getSomething()
{
$conn = ConnectionFactory::getFactory()->getConnection();
.
.
.
}
然后,在6个月内,当你的应用程序非常有名并且被挖掘和斜杠点化并且您决定需要多个连接时,您所要做的就是在getConnection()方法中实现一些池化。或者,如果您决定需要一个实现 SQL 日志记录的包装器,则可以传递一个 PDO 子类。或者,如果您决定在每次调用时都建立新的连接,则可以执行此操作。它是灵活的,而不是刚性的。
16 行代码,包括大括号,这将为您节省数小时和数小时的重构,使其大致相似。
请注意,我不考虑这种“功能蠕变”,因为我在第一轮中没有进行任何功能实现。这是“未来蠕变”的边界线,但在某些时候,“今天为明天编码”的想法总是一件坏事,这对我来说并不受欢迎。