2010-09-01 55 views
4

C#.Net 4.0只從一個地方進行類實例化的模式?

我想知道如何才能擁有一個只能從一個地方實例化的類。舉個例子:

我有一個供應商類。該課程公開了一種名爲GetData的方法。當調用GetData時,提供商將實例化一個數據類,填充並返回它。 Data類不能由任何不同於提供程序的人實例化,因此訪問數據的唯一方法是通過提供程序。一旦調用GetData並且調用者已收到類實例,他應該能夠訪問此類的屬性/方法。

這怎麼辦?有這種問題的模式嗎?一個簡短的樣本將不勝感激。提前致謝!

+0

這種解決方案設計可能被稱爲控制反轉。你可能會發現一個架構已經存在,可以從頭開始編寫。 :) – Russell 2010-09-01 11:25:55

回答

8

這聽起來像你正在尋找factory pattern

工廠模式是軟件開發 用於封裝參與創建 對象的 處理的造物 設計模式。

基本上,您的Provider類是控制Data類的實例創建的工廠。

你可以做的一件事是控制這個,就是將這兩個類型放在它們自己的程序集中,並使Data的構造函數爲internal,但是類本身public。這意味着任何引用程序集的人都會被迫使用Provider類來創建Data的實例(當然,除非他們使用了反射)。

+0

+1 Andrew - 提及Fcatory模式 – ChrisBD 2010-09-01 11:31:00

+0

感謝您的回覆。我其實想到了一個有多個組件的解決方案,但這對於這個小項目來說太大了。你有一個簡單的例子來說明如何實現這個模式,所有的東西都在同一個程序集中? – Mats 2010-09-01 11:43:52

-1
public class Provider 
{ 
    protected Provider() 
    { 
    } 

    public static Provider CreateNewProvider() 
    { 
    return new Provider(); 
    } 
} 
+0

OP想知道如何聲明'Data'類,而不是'Provider'類! – 2010-09-01 11:34:08

+0

啊我的錯誤是沒有正確閱讀這個問題。這就是投票的原因嗎? – ChrisBD 2010-09-01 12:19:20

+0

是的,因爲這是關於OP的問題的誤導。 – 2010-09-03 09:38:59

1

這裏是什麼安德魯描述一個例子:

public class Data 
{ 
    internal Data() 
    { 
     // internal constructor cannot be called from outside the assembly 
    } 

    // properties, fields and methods 
} 

public class Provider 
{ 
    public Data GetData() 
    { 
     return new Data(); 
    } 
} 
6

另一解決方案是創建一個接口IData,並聲明Provider.GetData方法返回IData代替Data。然後你可以讓你的Data類嵌套在Provider內。這樣你的Data類甚至不能通過相同程序集中的類來實例化。這裏是一個例子:

public interface IData 
{ 
    // properties and methods 
} 

public class Provider 
{ 
    public IData GetData() 
    { 
     return new Data(); 
    } 

    private class Data : IData 
    { 
     // your implementation 
    } 
} 
相關問題