Как иметь только один экземпляр класса? - PullRequest
0 голосов
/ 27 января 2012

Есть ли способ создать единственный экземпляр в классе?

В данный момент я пытаюсь создать только один экземпляр класса Random. Несколько раз мне нужно использовать его с определенным семенем. Можно ли поменять семена позже?

Я не уверен, я думаю, что это синглтон.

ОБНОВЛЕНИЕ: мне нужно иметь только один экземпляр класса Random. Идея состоит в том, чтобы использовать несколько раз одно и то же семя. Но позже мне нужно изменить начальное число, поэтому я не уверен, что синглтон - лучший способ, потому что я предполагаю, что изменение начального числа означает создание нового экземпляра.

Ответы [ 2 ]

6 голосов
/ 27 января 2012

В случае, если вы описываете, синглтон является излишним.Как правило, я рекомендую не использовать синглтоны в любом случае из-за сложности их модульного тестирования.

Поскольку вы указали, что вам понадобится периодически выполнять повторное заполнение, вам придется пропустить ключевое слово 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();
    }
}
6 голосов
/ 27 января 2012

Если вам нужен экземпляр с одним глобально (для домена, для потока или для каждого), тогда Singleton - правильный путь.

См. эту статью от Джона Скита, чтобы узнать, как это сделать правильно.

Поскольку вы пытаетесь создать один экземпляр существующего класса, который вы не можете изменить, то есть вы можетене ограничивайте доступ к его конструкторам, единственный путь будет следующим:

  • оберните этот класс фабрикой, которая создает единственный экземпляр
  • , убедитесь, что весь код использует только ваша фабрика для создания экземпляров этого класса

Если вам нужен один экземпляр в контексте одного класса , то я думаю, что довольно очевидно использовать что-то вродеprivate static readonly модификаторы или управление его экземпляром любым другим способом, поскольку он будет скрыт от внешнего слова.

...