如何只有一个类的实例

本文关键字:实例 有一个 | 更新日期: 2023-09-27 18:21:29

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

目前,我正试图只创建Random类的一个实例。有好几次我需要把它和某种种子一起使用。以后可以换种子吗?

我不确定,我想这是一个单身汉。

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

如何只有一个类的实例

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

请参阅Jon Skeet的这篇文章,了解如何正确操作。

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

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

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

在您描述的例子中,单例是过度的。我通常建议在任何情况下都不要使用单身汉,因为单元测试它们很困难。

由于您指定了需要定期重新设定种子,因此必须去掉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();
    }
}