簡體   English   中英

靜態類和實例類與私有構造函數之間的差異

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM