C#.Net 4.0
我想知道如何才能拥有一个只能从一个地方实例化的课程。一个例子:
我有一个提供者类。此类公开了一个名为 GetData 的方法。当 GetData 被调用时,提供商将实现数据类,填充并返回它。 数据类不能由提供商之外的任何人进行实例化,因此访问数据的唯一方法是通过提供商。调用 GetData 并且调用者已收到数据类实例后,他应该能够访问此类的属性/方法。
如何做到这一点?有这种问题的模式吗?一个简短的样本将受到高度赞赏。提前谢谢!
答案 0 :(得分:8)
听起来你正在寻找factory pattern:
工厂模式是创造性的 软件中使用的设计模式 开发封装了 参与创建的过程 对象。
基本上,您的Provider
类是控制Data
类实例创建的工厂。
您可以控制的一件事是将这两种类型放在它们自己的程序集中,并使Data
的构造函数为internal
,但类本身为public
。这意味着任何引用程序集的人都将被迫使用Provider
类来创建Data
的实例(当然,除非他们使用反射)。
答案 1 :(得分: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
}
}
答案 2 :(得分:1)
以下是Andrew所描述的一个例子:
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();
}
}
答案 3 :(得分:-1)
public class Provider
{
protected Provider()
{
}
public static Provider CreateNewProvider()
{
return new Provider();
}
}