如何只有一个类的实例?

Dar*_*Zon 0 c# random singleton design-patterns

有没有办法在类中创建唯一的实例?

此时,我正在尝试只创建一个Random类的实例.有几次我需要用一粒种子.以后可以换种子吗?

我不确定,我猜这是一个单身人士.

更新:我需要的是只有一个Random类的实例.这个想法是使用相同种子的几次.但后来我需要改变种子,所以我不确定单身是否是最好的方法,因为我想改变种子意味着创建一个新的实例.

Res*_*uta 6

如果您需要一个全局的实例(每个域,每个线程或每个),那么Singleton是正确的方法.

请参阅Jon Skeet的这篇文章,看看如何正确地做到这一点.

由于您正在尝试创建无法修改的现有类的单个实例,这意味着您无法限制对其构造函数的访问,因此唯一的方法是:

  • 用生成单个实例的工厂包装此类
  • 确保所有代码使用您的工厂来创建此类的实例

如果你需要在一个类上下文中使用单个实例,那么我认为使用像private static readonly修饰符这样的东西或以任何其他方式控制它的实例是非常明显的,因为它将被隐藏在外部词之外.


Dan*_*ann 6

在你描述的情况下,单身人士是过度的.在任何情况下,由于单元测试的困难,我通常会建议不要使用单身人士.

由于您指定您需要能够定期重新种植,因此您必须不再使用该readonly关键字.

例如:

public class Foo 
{
    private static Random randGen = new Random();
    public void Foo()
    {
        int i = this.randGen.Next();
    }

    public void Bar()
    {
        int j = this.randGen.Next();
    }

    public void ReseedRandomNumberGenerator(int? seed = null)
    {
        this.randGen = seed.HasValue ? new Random(seed.Value) : new Random();
    }
}
Run Code Online (Sandbox Code Playgroud)