单身对工厂?

时间:2010-05-03 09:37:46

标签: php design-patterns

我有3个Log类,它们都实现了iLog接口:

DatabaseLog
FileLog
ScreenLog

只能有一个实例。最初我虽然为每个类使用单一模式,但后来我想为什么不使用工厂进行实例化,因此我不必为它们中的每一个和所有未来的Log类创建单个模式。

也许有人会希望它们在未来成为多个对象。

所以我的问题是:我应该在这里使用工厂或单件模式吗?

5 个答案:

答案 0 :(得分:6)

创建Logger实例的责任在哪里?每个想要登录的课程?有一些了解整体背景的监督部分吗?

我认为它更有可能是后者,因此工厂将有意义。 faactory可以拥有决定需要哪种日志记录的所有逻辑。

答案 1 :(得分:3)

单身人士和工厂模式完全不同。这个单例模式用于确保只有一个类的实例。工厂模式用于抽象对象实例化。您可以使用工厂来创建单身人士,而工厂本身通常是单身人士,但没有人与其他人相比。它们是互补而非对立的模式。

在您的情况下,实现单例模式可确保每个类只能有一个实例。如果已存在,则可以使用不创建新实例的工厂。

如果您有一个用于记录的接口,以及它的多个实现(例如,记录到文件或记录到网络),您可以使用工厂动态实例化实现,并隐藏实例化过程,这可能因每个实现而不同(例如,打开文件或打开套接字)。如果这是你想要的,你仍然可以让你的对象单身。

答案 2 :(得分:1)

如果有人想要创建这些类型的多个对象,那么单身显然是不可能的。

创建一个工厂,从配置文件中读取日志类型(可能)并返回ILog引用到具体类型

答案 3 :(得分:1)

与其他人一样,我也建议使用工厂。不使用Singletons的一个优点是您没有全局状态,因此使您的代码更易于测试。

答案 4 :(得分:0)

我在这里使用工厂,单例不能满足你在所有三个类之间的一个实例化的要求。