Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 单件vs工厂?_Php_Design Patterns - Fatal编程技术网

Php 单件vs工厂?

Php 单件vs工厂?,php,design-patterns,Php,Design Patterns,我有3个日志类,它们都实现了iLog接口: DatabaseLog FileLog ScreenLog 它们只能有一个实例。起初我想对每个类使用单一模式,但后来我想为什么不使用工厂来进行实例化,因为这样我就不必为每个类和所有未来的日志类创建单一模式 也许将来有人会希望它们成为多个对象 所以我的问题是:我应该在这里使用工厂模式还是单例模式?创建记录器实例的责任应该在哪里?每个想要登录的类?是否有某种能够理解整体环境的监督组件 我认为更可能是后者,因此工厂是有意义的。factory可以拥有决定需要

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

DatabaseLog
FileLog
ScreenLog
它们只能有一个实例。起初我想对每个类使用单一模式,但后来我想为什么不使用工厂来进行实例化,因为这样我就不必为每个类和所有未来的日志类创建单一模式

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


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

创建记录器实例的责任应该在哪里?每个想要登录的类?是否有某种能够理解整体环境的监督组件


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

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

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


创建一个工厂,从配置文件(可能)读取日志类型,并返回对具体类型的ILog引用。单例和工厂模式的用途完全不同。此单例模式用于确保一个类只有一个实例。工厂模式用于抽象对象实例化。您可以使用工厂创建一个单例,工厂本身通常是单例,但没有一个与另一个相对。它们是互补的而不是对立的模式

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


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

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

这三个类之间的区别是什么?对,我认为最好这样做。因为如果其他人在另一个应用程序中使用我的日志类,他可以使用另一种逻辑。谢谢