类实例化的模式只来自一个地方?

时间:2010-09-01 11:23:39

标签: c# .net design-patterns class-design

C#.Net 4.0

我想知道如何才能拥有一个只能从一个地方实例化的课程。一个例子:

我有一个提供者类。此类公开了一个名为 GetData 的方法。当 GetData 被调用时,提供商将实现数据类,填充并返回它。 数据类不能由提供商之外的任何人进行实例化,因此访问数据的唯一方法是通过提供商。调用 GetData 并且调用者已收到数据类实例后,他应该能够访问此类的属性/方法。

如何做到这一点?有这种问题的模式吗?一个简短的样本将受到高度赞赏。提前谢谢!

4 个答案:

答案 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();
  }
}