2010-05-03 83 views
3

我已经得到了所有实现ILOG接口3日志类:singleton vs工厂?

DatabaseLog 
FileLog 
ScreenLog 

只能有其中的一个实例。最初我虽然为每个类使用单一模式,但后来我想为什么不使用工厂实例化,因为我不会为每个类和所有未来的日志类创建单一模式。

也许有人会希望他们作为未来的多个对象。

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

回答

6

创建Logger实例的责任应该放在哪里?每个班都想登录?用某种理解总体背景的监督组成部分?

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

+0

对,我认为这样更好。因为如果其他人在另一个应用程序中使用我的Log类,他可以使用另一种逻辑。谢谢 – 2010-05-03 09:45:45

0

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

+0

这三个班级之间的含义是什么? – 2010-05-03 09:44:49

1

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

创建一个工厂,读取日志从配置文件类型(也许)和返回的ILog参考具体类型

3

单身主义者和工厂模式服务于完全不同的目的。这个单例模式用于确保只有一个类的实例。工厂模式用于抽象对象实例化。你可以使用一个工厂来创建一个单身人士,而工厂本身通常是单身人士,但是没有一个人与另一个人。它们是互补的而不是反对的模式。

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

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

1

像其他人一样,我也建议使用工厂。不使用单例时的一个优点是你没有全局状态,因此使你的代码更加可测试。