C# Singleton метод "GetInstance" или свойство "Instance"?

С точки зрения конечного пользователя API, которому нужно " получить an экземпляр "Одноэлементного класса, вы предпочитаете "получить"an the .Свойство экземпляра или" вызов " a .Метод 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 ответов


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


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

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;
    }
}

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


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

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

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


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


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 объявляется изменчивой, чтобы гарантировать, что назначение переменной экземпляра завершается до того, как переменная экземпляра может быть доступна.


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


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

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

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

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