单例模式 vs 工厂模式?

3

我有三个实现了iLog接口的日志类:

DatabaseLog
FileLog
ScreenLog

它们只能有一个实例。最初我想为每个类使用单例模式,但后来我想为何不使用工厂进行实例化呢?因为这样我就不必为所有未来的Log类创建单例模式。

也许将来有人希望将它们作为多个对象使用。

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

5个回答

6

创建Logger实例的责任应该放在哪里?是每个想要记录日志的类中?还是某种了解整体上下文的监督组件中?

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


好的,我认为这样做更好。因为如果别人在另一个应用程序中使用我的日志类,他们可以使用另一种逻辑。谢谢。 - never_had_a_name

4
单例模式和工厂模式的作用完全不同。单例模式用于确保类只有一个实例。工厂模式用于抽象对象实例化。您可以使用工厂创建单例,而工厂本身通常是单例,但两者并不对立,它们是互补而不是相反的模式。
在您的情况下,实现单例模式可以确保每个类只有一个实例。如果已经存在一个实例,则可以使用不创建新实例的工厂。
如果您拥有一个记录接口以及几个实现(例如记录到文件或记录到网络),则可以使用工厂动态实例化实现,并隐藏实例化过程,这可能因每个实现而异(例如打开文件或打开套接字)。如果需要,仍然可以使您的对象成为单例。

1

如果有人想要创建多个这些类型的对象,那么单例显然不适用。

创建一个工厂,从配置文件中读取日志类型,并返回对具体类型的 ILog 引用。


1

像其他人所说的,我也建议使用工厂模式。不使用单例的一个优点是你没有全局状态,因此使你的代码更易于测试。


0
我会在这里使用工厂模式,单例模式无法满足你要求三个类之间只有一个实例的需求。

在这三个类之间,你指的是什么意思? - never_had_a_name

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接