2010-02-22 35 views
7

什么是用于在Perl实现Singletons最好的做法?如何在perl中实现单例类?

+1

执行单身人士的最佳做法是**不要** – 2010-02-22 14:39:09

+0

@gbacon - !这将是对实现sigletons的原因(S)?当然,我从来没有广泛使用它们(或者几乎从不使用它们),但我不知道有什么理由避免它们,而不是不一定需要它们。 – DVK 2010-02-22 14:51:04

+3

@DVK一个单身人士是穿着花式西装的全球变数。 – 2010-02-22 15:00:58

回答

16

可以使用Class::Singleton模块。

“Singleton”类也可以使用mystate变量(后者自Perl 5.10起可用)轻松实现。但请参阅下面的@ Michael的评论。

package MySingletonClass; 
use strict; 
use warnings; 
use feature 'state'; 

sub new { 
    my ($class) = @_; 
    state $instance; 

    if (! defined $instance) { 
     $instance = bless {}, $class; 
    } 
    return $instance; 
} 
+4

如果模块是子类型的,则失败;实例变量需要存在于最终的包中。 Class :: Singleton得到这个权利。 – 2010-02-22 14:11:31

+3

如果它被继承,它并不真正“失败”。继承的类只需像任何其他类一样访问单例对象并与其交互。但是,这一切都取决于你想要做什么。 – 2010-02-22 20:12:43

2

辛格尔顿摘要:

  • 大部分时间正常对象将正常工作。
  • 小心单身。
  • 本地化互动尽可能

虽然单身是一个不错的主意,我倾向于只实现一个正常的对象,并使用它。如果至关重要的是我只有一个这样的对象,那么我将修改构造函数以在创建第二个对象时引发致命异常。除了添加依赖关系之外,各种单例模块看起来并没有多大作用。

我这样做是因为它很容易,它的工作原理,当在一些奇怪的将来,我需要在我的应用程序的第二个目的的工作,这些变化被最小化。

我也喜欢本地化的互动与我的“单”的对象 - 保持互动,尽可能少的地方越好。因此,不是每个对象都可以直接访问单例,而是通过我的“应用程序”对象调解所有的交互。只要有可能,应用程序对象从“单例”中获取数据,并将其作为参数传递给其他对象中的方法。来自其他物体的反应也可能被消灭并传递给“单身人士”。当我需要在'singleton'对象中进行更改时,以及当我想在另一个可能不需要的应用程序中重用其他对象或者能够使用原始'singleton'对象时,所有这些工作都会有所帮助。

+1

我想你错过了单身人士的观点。这是一种可以使用的模式,因此您不必执行所有复杂的中介。你不必使用它,但不要因为你不需要它而打折。不是所有的东西都符合你所描述的方案。 – 2010-02-22 20:11:00