[英]Differences between singleton/static class/instance class with a private ctor?
[英]Differences between static class and instance class with private constructor
雖然靜態類只有一個實例而且無法實例化,但是無法實例化具有私有構造函數的類(因為無法看到構造函數),所以每次調用此類時,這都是相同的實例?
工廠類始終遵循最后一個約定(具有私有構造函數的實例類)。 為什么是這樣?
謝謝
私有構造函數沒有什么能阻止類具有返回類實例的公共靜態方法:
public class NoPublicConstructor
{
private NoPublicConstructor()
{
}
public static NoPublicConstructor NewInstance()
{
return new NoPublicConstructor();
}
}
如您所見,靜態方法不返回相同的一個實例。
編輯:工廠類執行此操作的原因之一是能夠在將來的版本中分離責任:當您的代碼始終調用工廠創建方法時,作者可能會將該類中的所有“膽量”移動到另一個類中,並且您的代碼不需要知道差異。 調用該類'(public)構造函數將其綁定到原始類實現的程度。
你不能*從課外獲得一個實例,但你可以從里面獲取。 靜態方法或內部類可以使用私有構造函數創建和返回類的實例。 靜態類不能由任何實例實例化。
class Foo
{
private Foo()
{
}
public class Bar
{
public Bar()
{
}
public Foo GetFoo()
{
return new Foo();
}
}
}
..
Foo.Bar fooBar = new Foo.Bar();
Foo foo = fooBar.GetFoo();
編輯: *我使用術語“不能”松散。 Brian Rasmussen在對OP的評論中指出,獲取實例的另一種方法是通過System.Runtime.Serialization.FormatterServices調用,這是類本身的外部。
Foo foo = (Foo)System.Runtime.Serialization.FormatterServices.GetSafeUninitializedObject(typeof(Foo));
使用私有構造函數創建類是實現“Singleton”對象的常見模式。
Singleton通常會實例化自身的實例,並且只允許通過靜態“Instance”屬性訪問它,這意味着只有該類的一個實例。
在純靜態類上使用Singleton的優點是可以在單例中使用接口和不同的實現類。 您的“Singleton”可能會為一組方法公開一個接口,您可以選擇要在底層實例化的確切實現類。 如果您使用的是純靜態類,那么在不影響其他代碼的情況下更換完全不同的實現將很困難。
Singleton的主要缺點是很難換出實現類進行測試,因為它是在Singleton私有方法中控制的,但是有辦法解決這個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.