C # Синглтон Метод GetInstance или Свойство Instance? - PullRequest
8 голосов
/ 01 сентября 2009

С точки зрения конечного пользователя API, которому необходимо "получить * экземпляр" класса Singleton, вы предпочитаете "получить" свойство .Instance или "вызвать" метод .GetInstance ()?

public class Bar
{
    private Bar() { }

    // Do you prefer a Property?
    public static Bar Instance
    {
        get
        {
            return new Bar();
        }
    }

    // or, a Method?
    public static Bar GetInstance()
    {
        return new Bar();
    }
}

Ответы [ 7 ]

15 голосов
/ 01 сентября 2009

В C # я бы предпочел .Instance, так как он соответствует общим рекомендациям.

13 голосов
/ 01 сентября 2009

Если вы хотите создать синглтон, вы не можете просто возвращать новый объект при каждом вызове GetInstance или Instance свойства get. Вы должны сделать что-то вроде этого:

public sealed class Bar
{
    private Bar() { }

    // this will be initialized only once
    private static Bar instance = new Bar();

    // Do you prefer a Property?
    public static Bar Instance
    {
        get
        {
            return instance;
        }
    }

    // or, a Method?
    public static Bar GetInstance()
    {
        return instance;
    }
}

И не имеет значения, какой способ выбора вы выберете. Если вы предпочитаете работать со свойствами, выберите его, если вы предпочитаете методы, все будет в порядке.

4 голосов
/ 01 сентября 2009

Как и почти все, это зависит:)

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

Если мы просто маскируем для защиты экземпляра синглтона, предпочтительнее свойство.

3 голосов
/ 01 сентября 2009

Зависит. Вам нужно передать параметры? Если это так, я бы сделал GetInstance (). Если нет, то, вероятно, это не имеет значения (по крайней мере, с точки зрения вызова, поскольку в любом случае они на самом деле оба метода; однако, имеет значение , если вы пытаетесь быть более основанными на стандартах и в этом случае экземпляр выглядит лучше).

2 голосов
/ 01 сентября 2009
public class Singleton
{

    private volatile static Singleton uniqueInstance;
    private static readonly object padlock = new object();

    private Singleton() { }

    public static Singleton getInstance()
    {
        if (uniqueInstance == null)
        {
            lock (padlock)
            {
                if (uniqueInstance == null)
                {
                    uniqueInstance = new Singleton();
                }
            }
        }
        return uniqueInstance;
    }
}

В приведенном выше коде реализована двойная проверка, сначала проверяется, создан ли экземпляр и установлена ​​ли блокировка. Раз в этом блоке

                if (uniqueInstance == null)
                {
                    uniqueInstance = new Singleton();
                }

если экземпляр имеет значение null, создайте его.

Кроме того, переменная uniqueInstance объявляется энергозависимой, чтобы гарантировать, что присвоение переменной экземпляра завершается до того, как к переменной экземпляра можно будет получить доступ.

0 голосов
/ 01 сентября 2009

Как сказал @Rex, это зависит от семантики, которую вы хотите передать.

GetInstance () не обязательно подразумевает одноэлементный экземпляр. Итак, я бы использовал GetInstance () в случае, когда создание экземпляра происходит по запросу, прямое новое нежелательно, и экземпляр может быть, но не гарантируется, что он будет таким же. Пулы объектов также соответствуют этим критериям. (Фактически, синглтон - это специализация пула объектов с сохранением состояния: -))

С другой стороны, свойство статического экземпляра подразумевает одноэлементную и сохраненную идентичность экземпляра.

Кстати, как @RaYell упомянул, ваш пример кода не является одноэлементным, поэтому не следует использовать свойство Instance. В этом случае вы все еще можете использовать метод GetInstance (), так как он будет служить фабрикой экземпляров.

0 голосов
/ 01 сентября 2009

Я предпочитаю собственность, это стандартные шаблоны.

...