2010-02-22 37 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