2012-01-08 349 views
23

可能重复:
Who needs singletons?最佳实践

我一直对于写最佳实践,但我也想知道为什么给定的是一个最佳实践。我已经阅读了一篇文章(我不幸忘记了),单例类最好是实例化的,而不是用静态函数制作,并且使用范围解析运算符(:)进行访问。所以,如果我有一个包含我所有的工具来验证类,简称:

class validate { 
    private function __construct(){} 
    public static function email($input){ 
     return true; 
    } 
} 

有人告诉我,这被认为是不好的做法(或至少对警告),因为这样的事情作为垃圾收集器和维护。那么对于“单例类作为静态方法”的批评所要做的是,我实例化一个类,我100%确定我只会实例化一次。对我来说,这似乎是在做“双重工作”,因为它已经准备就绪。我错过了什么?

关于此事的观点是什么?当然,这不是一个生死攸关的问题,但是,如果选项是有的话,也可以做正确的事情:)

+1

[谁需要单身?](http://stackoverflow.com/a/4596323/208809) – Gordon 2012-01-08 11:28:45

回答

51
+1

感谢您的链接;已经阅读过它们。我想我可能会误解一个单身人士是什么(这在下面的回复中已经指出) – 2012-01-08 10:56:12

+0

@MarkHünermundJensen认为阅读你的问题。 Tats为什么张贴链接;)。 – ThinkingMonkey 2012-01-08 11:04:23

+1

请注意依赖注入不等于依赖注入容器。 DI绝对是一件好事; DIC是实现这一目标的一种方式,并不一定是一种通用的解决方案(尽管目前在PHP世界中它非常“流行”)。服务定位器或类似模式也可能是打破依赖关系的可接受方式。 – liquorvicar 2012-01-08 11:17:06

2

那么,这实际上并不是一个单身人士;一个单例确保你只有一个类的单个实例,并且这里没有方法可以检索单个Validate实例。这里的设计似乎是一个静态类。这不会导致垃圾收集器出现问题(至少是你放在这里的代码),因为无论如何它都会被加载到内存中。

+0

这可能会解释为什么我无法找到逻辑,因为这种类将是一个问题。所以单身人士并不是说只有一次实例化的类,但该方法 - 也只能被调用一次? – 2012-01-08 10:57:19

5

一个Singleton对象是仅实例化一次一个对象。这是不一样的Singleton Pattern,这是一个(反)模式如何写一个类,可以只实例化一次,辛格尔顿(大小号开头):

“确保一个类只有一个实例,并提供一个全局访问点。“

就PHP而言,你通常不需要实现Singleton模式。其实你应该避免这样做,当你要求最佳实践,因为它是不好的做法

此外,您发现大多数PHP代码示例都是模式的半准备实现,忽略了PHP的工作方式。这些虚假实现不符合模式中的“确保”。

这也告诉了一些事情:通常这是不需要的。如果一个草率的实现已经完成了工作,而没有接近该模式的用途,那么错误的模式已经被用于这种情况,它开始成为反模式的

在PHP中,通常不需要确保一个类只有一个实例,PHP应用程序并不那么复杂,您可能需要它(例如,没有多个线程可能需要引用一个原子实例)。

通常留下的是类实例的全局访问点,这是大多数PHP开发人员(错误)使用该模式的原因。正如今天所知,使用这种“单身人士”会导致全局静态状态的标准问题,从而在多个级别中将代码复杂化,并降低可重用性。作为程序员,您无法灵活地使用代码。但灵活性是解决问题的一项非常重要的技术。程序员整天都在解决问题。

因此,在应用设计模式之前,需要评估正反两面。最经常使用某种模式是没有用的。对于初学者,我会说,只需编写你的类,并注意它们在应用程序逻辑的某些其他部分如何以及何时被实例化,这样就保持了灵活性。

+0

很好的答案 - 谢谢:) – 2012-01-08 12:40:06

+3

你的第一句话是矛盾的:)。 -1。对于“PHP应用程序并不那么复杂”也是-1。您可以使用任何语言编写复杂的软件。设计模式与软件体系结构相关,而与下层技术相关。我会triplle downvote,但我不能。 :) – 2014-01-26 08:54:29

+0

@Geo C.我写这样一个理由的一个原因是,PHP应用程序通常不需要跨越进程和线程的原子性,这是多*复杂软件中线程安全单例的一种用例。你或许判断得太快,因为你认为这确实会攻击某种特定的语言,但事实并非如此。这只是普通的PHP代码不需要模式的实现。如果你仍然需要它,我甚至会在我的博客上提供这种模式。 – hakre 2014-01-26 10:02:00