Встроен ли шаблон проектирования Singleton в какие-либо фреймворки? - PullRequest
1 голос
/ 13 июля 2010

Использование класса Singleton гарантирует один экземпляр класса для управления программистом. Действительно полезно.

Мне было интересно, существует ли, например, интерфейс Singleton в данной среде, чтобы обойти необходимость его создания / добавления явно?

Было бы удобно для декальре:

public sealed class MySingleton : ISingleton  //or a different class 
    { ... }

А потом ожидайте, что класс будет создан только один раз.

Это хорошая идея, или я немного ошибаюсь? :)

Ответы [ 9 ]

8 голосов
/ 13 июля 2010

Мне было интересно, существует ли, например, интерфейс Singleton в данной инфраструктуре, чтобы обойти необходимость явно создавать / добавлять интерфейс?

Он не существует и не может существовать.Для синглтона в основном требуется метод static Singleton getInstance(), но, поскольку он static, его нельзя определить как абстрактный (интерфейсный) метод.Это также имеет смысл, может быть только одна одноэлементная реализация, а не несколько.Абстрагировать это бессмысленно.

Вам нужно будет самостоятельно составить набор синглетонов.Однако я очень сомневаюсь, насколько это полезно.Это, конечно, не единственная цель - предотвратить переполнение стека или ошибки памяти.Написание хорошего кода предотвращает это.Синглтоны полезны, только если вы хотите, чтобы конечный пользователь имел дело с одним и тем же экземпляром все время.Что, кстати, можно сделать без единого шаблона.Либо просто объявите его static, либо воспользуйтесь концепцией «области применения», которую может предоставить средняя структура.

Вместо синглетонов вместо этого ищите инверсию управления (внедрение зависимостей),Кстати, именно это и делает Spring.Они не используют "чистые" синглтоны.Это был плохой выбор слов, который они сделали.

См. Также:

2 голосов
/ 13 июля 2010

Google Guice - это структура для внедрения зависимостей, поддерживающая аннотацию @Singleton.

Обратите внимание, что классы, помеченные @Singleton, не являются "настоящими" синглетонами - ничто не мешает клиентскому коду создавать множество экземпляров такого класса. Однако все управляемые Guice зависимости будут использовать один и тот же экземпляр.

См. http://code.google.com/p/google-guice/wiki/Scopes

2 голосов
/ 13 июля 2010

Singleton не предотвращает переполнение стека, не уверен, к чему вы клоните.

Для Java в голову пришла Spring.По умолчанию каждый написанный вами Spring-бин является одиночным.Вы можете использовать его в 100 местах, и все они будут установлены автоматически посредством инъекции, и все 100 ссылок будут идти к одному и тому же объекту (то есть к одиночке).Когда вы настраиваете проект в Spring, вы можете создать любой класс, который вам нужен, только следуя соглашениям.

1 голос
/ 18 июля 2010

Ruby имеет модуль с именем singleton , который делает класс, в который он входит, синглтоном.Этот модуль встроен в стандартную библиотеку.

1 голос
/ 18 июля 2010

.NET 4.0 имеет класс Lazy (T) , который будет лениво инициализировать значение при первом доступе в поточно-ориентированном режиме. В теме Lazy Initialization есть множество примеров.

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

1 голос
/ 14 июля 2010

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

public enum MySingleton {
    INSTANCE;
} 
1 голос
/ 13 июля 2010

Может быть, не то, что вы ищете, но вот моя любимая версия шаблона синглтона в C #.Он ориентирован на многопотоковое исполнение, использует ленивую реализацию и не требует никаких блокировок.Это также довольно безболезненно, чтобы писать ... никаких рамок не требуется.;)

class MyClass
{
  // ...
  #region Singleton pattern
  private MyClass() { }
  public static MyClass Instance { get { return Singleton.instance; } }
  class Singleton
  {
    static Singleton() { }
    internal static readonly MyClass instance = new MyClass();
  }
  #endregion
  // ...
}

Чтобы получить экземпляр объекта:

MyClass m = MyClass.Instance;
0 голосов
/ 21 апреля 2012
public class Singleton<T> where T : class, new()
{
    static class SingletonCreator
    {
        internal static readonly T instance = new T();
    }

    public static T Instance
    {
        get
        {
            return SingletonCreator.instance;
        }
    }
}

Это ленивый и универсальный. Определите конструкторы по требованию.

0 голосов
/ 13 июля 2010

Назначение шаблона синглтона - «Настроить один раз. Использовать несколько раз». Обычно это используется для обмена данными или ресурсами любого типа, как указано в одном из ответов выше. Но также полезно включить любое приложение управления. (подумайте JMX, если это Java)

У вас есть один экземпляр определенного класса, который вы можете использовать несколько раз. Поскольку существует только один экземпляр, при соответствующей настройке этого экземпляра вы можете отразить изменения конфигурации в приложении. Следовательно, одноэлементный шаблон дает возможность включить «панель управления» для вашего приложения.

Spring или Spring.NET (реализация Spring для .NET) полезны для настройки и внедрения синглетонов. Те же аргументы применимы к любому виду внедрения зависимостей. Вы должны прочитать о внедрении зависимости в целом, чтобы использовать всю мощь. Истинный синглтон, в нескольких JVM или кластерах, обычно сложнее создавать и управлять. и может потребоваться поддержка инструмента. На практике нет необходимости создавать и поддерживать это.

Не путайте синглетоны со статиками! Конструкция выглядит аналогично, но может быть довольно разной. Теперь барабанить своей собственной трубой! Здесь - ссылка на статью, которую я написал о статических методах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...