C#.Net 4.0只從一個地方進行類實例化的模式?
我想知道如何才能擁有一個只能從一個地方實例化的類。舉個例子:
我有一個供應商類。該課程公開了一種名爲GetData的方法。當調用GetData時,提供商將實例化一個數據類,填充並返回它。 Data類不能由任何不同於提供程序的人實例化,因此訪問數據的唯一方法是通過提供程序。一旦調用GetData並且調用者已收到類實例,他應該能夠訪問此類的屬性/方法。
這怎麼辦?有這種問題的模式嗎?一個簡短的樣本將不勝感激。提前致謝!
C#.Net 4.0只從一個地方進行類實例化的模式?
我想知道如何才能擁有一個只能從一個地方實例化的類。舉個例子:
我有一個供應商類。該課程公開了一種名爲GetData的方法。當調用GetData時,提供商將實例化一個數據類,填充並返回它。 Data類不能由任何不同於提供程序的人實例化,因此訪問數據的唯一方法是通過提供程序。一旦調用GetData並且調用者已收到類實例,他應該能夠訪問此類的屬性/方法。
這怎麼辦?有這種問題的模式嗎?一個簡短的樣本將不勝感激。提前致謝!
這聽起來像你正在尋找factory pattern:
工廠模式是軟件開發 用於封裝參與創建 對象的 處理的造物 設計模式。
基本上,您的Provider
類是控制Data
類的實例創建的工廠。
你可以做的一件事是控制這個,就是將這兩個類型放在它們自己的程序集中,並使Data
的構造函數爲internal
,但是類本身public
。這意味着任何引用程序集的人都會被迫使用Provider
類來創建Data
的實例(當然,除非他們使用了反射)。
public class Provider
{
protected Provider()
{
}
public static Provider CreateNewProvider()
{
return new Provider();
}
}
OP想知道如何聲明'Data'類,而不是'Provider'類! – 2010-09-01 11:34:08
啊我的錯誤是沒有正確閱讀這個問題。這就是投票的原因嗎? – ChrisBD 2010-09-01 12:19:20
是的,因爲這是關於OP的問題的誤導。 – 2010-09-03 09:38:59
這裏是什麼安德魯描述一個例子:
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();
}
}
另一解決方案是創建一個接口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
}
}
這種解決方案設計可能被稱爲控制反轉。你可能會發現一個架構已經存在,可以從頭開始編寫。 :) – Russell 2010-09-01 11:25:55