2012-02-03 50 views
3

可能重複:
Factory pattern in C#: How to ensure an object instance can only be created by a factory class?我可以限制哪些類可以實例化另一個類?

假設我有一個知道如何使廣場的工廠類。如果我覺得只有Factory類知道如何製作一個正方形,並且我想阻止其他人(即使在同一個裝配中)創建一個Square,那麼正確的方式(如果有這樣的事情的話)可以去解決嗎?

+0

使構造函數爲私有,工廠類爲Square的嵌套類型:http://stackoverflow.com/a/515288/ 284240 – 2012-02-03 10:27:45

+1

感謝蒂姆,但不工作這麼好,當我要添加三角形和菱形...... – 2012-02-03 11:23:04

回答

2

你可以在工廠和類移動到組裝和紀念類的構造函數內部,使其只能從組件內調用。

請注意,這將允許其他組件成員雖然訪問的構造,不僅工廠。

這是怎麼Lookup<TKey, TElement>作品實例。我看到(與工廠,並在同一組件上的Square

+0

也許我會解決最終使用。我想在某些時候,如果我真的想要如果有人濫用它,我可以使用一些反射來在運行時拋出異常。 – 2012-02-03 11:25:25

2

一種方式是將你的工廠方法爲Square類的靜態方法,並添加只有私有構造您Square類。

您也可以將您的Factory類作爲一個內部類的Square

public class Square 
{ 
    private Square() 
    { 
    } 

    public int Size { get; set; } 

    public static class Factory 
    { 
     public static Square CreateClass() 
     { 
      return new Square { Size = 10 }; 
     } 
    } 
} 
5

根據你的情況,你可以這樣做:

public class Square 
{ 
    // Only Square and classes nested within it can call this 
    private Square() 
    { 
    } 

    public class Factory 
    { 
     public Square CreateSquare() 
     { 
      return new Square(); 
     } 
    } 
} 

然後:

Square.Factory factory = new Square.Factory(); 
Square square = factory.CreateSquare(); 
+1

如果我要做到這一點,豈不更有意義有廣場是內部類,這樣我可以爲圓形或三角形一樣嗎?這顯然向後似乎我,但我看到別人發佈了同樣的答案,因此讓我好奇,如果我在這裏失去了一些東西... – 2012-02-03 10:38:46

+0

@BrandonMoore:它不會在這種情況下工作,作爲含類不有權訪問嵌套類的私有成員。我們需要知道一個更現實的場景,基本上 - 這種模式非常有用(特別是對於實現Builder模式),但它不是*通用*適用的。 – 2012-02-03 10:56:20

+0

哦,對,我知道。奇怪的是,我認爲我聽說根據規範,內部類不應該訪問外部類的私有成員......但是由於C#和其他編譯器有用,所以它仍然允許它。 – 2012-02-03 11:01:42

相關問題