Jump to content

Шаблон синглтон

Диаграмма классов, иллюстрирующая шаблон Singleton.

В разработке программного обеспечения синглтон это шаблон проектирования программного обеспечения , который ограничивает создание экземпляра класса шаблон единственным экземпляром. Один из известных шаблонов проектирования «Банда четырёх» , описывающий, как решать повторяющиеся проблемы в объектно-ориентированном программном обеспечении . [1] шаблон полезен, когда для координации действий в системе необходим ровно один объект.

Более конкретно, шаблон Singleton позволяет объектам: [2]

Этот термин происходит от математической концепции синглтона .

Обычное использование

[ редактировать ]

Синглтоны часто предпочтительнее глобальных переменных , поскольку они не загрязняют глобальное пространство имен (или содержащее их пространство имен). Кроме того, они допускают ленивое выделение и инициализацию, тогда как глобальные переменные во многих языках всегда потребляют ресурсы. [1] [3]

Шаблон Singleton также можно использовать в качестве основы для других шаблонов проектирования, таких как абстрактная фабрика , фабричный метод , шаблоны построения и прототипа . Фасадные объекты также часто являются одиночными, поскольку требуется только один фасадный объект.

Ведение журнала — распространенный реальный вариант использования синглтонов, поскольку всем объектам, которые хотят регистрировать сообщения, требуется единая точка доступа и концептуально запись осуществляется в один источник. [4]

Реализации

[ редактировать ]

Реализация шаблона Singleton гарантирует, что когда-либо существует только один экземпляр класса Singleton, и обычно обеспечивает глобальный доступ к этому экземпляру.

Обычно это достигается путем:

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

Эта реализация C++11 основана на реализации до C++98, описанной в книге. [ нужна ссылка ] .

#include <iostream>

class Singleton {
public:
  // defines an class operation that lets clients access its unique instance.
  static Singleton& get() {
    // may be responsible for creating its own unique instance.
    if (nullptr == instance) instance = new Singleton;
    return *instance;
  }
  Singleton(const Singleton&) = delete; // rule of three
  Singleton& operator=(const Singleton&) = delete;
  static void destruct() {
    delete instance;
    instance = nullptr;
  }
  // existing interface goes here
  int getValue() {
    return value;
  }
  void setValue(int value_) {
    value = value_;
  }
private:
  Singleton() = default; // no public constructor
  ~Singleton() = default; // no public destructor
  static Singleton* instance; // declaration class variable
  int value;
};

Singleton* Singleton::instance = nullptr; // definition class variable

int main() {
  Singleton::get().setValue(42);
  std::cout << "value=" << Singleton::get().getValue() << '\n';
  Singleton::destruct();
}

Вывод программы

value=42

Это реализация синглтона Мейерса. [5] в С++11. Синглтон Мейерса не имеет метода разрушения. Вывод программы такой же, как указано выше.

#include <iostream>

class Singleton {
public:
  static Singleton& get() {
    static Singleton instance;
    return instance;
  }
  int getValue() {
    return value;
  }
  void setValue(int value_) {
    value = value_;
  }
private:
  Singleton() = default;
  ~Singleton() = default;
  int value;
};

int main() {
  Singleton::get().setValue(42);
  std::cout << "value=" << Singleton::get().getValue() << '\n';
}

Ленивая инициализация

[ редактировать ]

Одноэлементная реализация может использовать отложенную инициализацию , при которой экземпляр создается при первом вызове статического метода. В многопоточных программах это может вызвать состояние гонки , приводящее к созданию нескольких экземпляров. Следующий Java 5+ пример [6] — это потокобезопасная реализация, использующая ленивую инициализацию с двойной проверкой блокировки .

public class Singleton {

    private static volatile Singleton instance = null;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized(Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

Некоторые считают синглтон антишаблоном , который вводит глобальное состояние в приложение, часто без необходимости. Это приводит к потенциальной зависимости других объектов от синглтона, что требует анализа деталей реализации, чтобы определить, существует ли зависимость на самом деле. [7] Эта повышенная связанность может создать трудности при модульном тестировании . [8] В свою очередь, это накладывает ограничения на любую абстракцию, использующую синглтон, например, предотвращает одновременное использование нескольких экземпляров. [8] [9] [10]

Синглтоны также нарушают принцип единой ответственности , поскольку они несут ответственность за обеспечение своей уникальности наряду с выполнением своих обычных функций. [8]

См. также

[ редактировать ]
  1. ^ Jump up to: а б Эрих Гамма, Ричард Хелм, Ральф Джонсон, Джон Влиссидес (1994). Шаблоны проектирования: элементы объектно-ориентированного программного обеспечения многократного использования . Эддисон Уэсли. стр. 127 и далее . ISBN  0-201-63361-2 . {{cite book}}: CS1 maint: несколько имен: список авторов ( ссылка )
  2. ^ «Шаблон проектирования Singleton — проблема, решение и применимость» . w3sDesign.com . Проверено 16 августа 2017 г.
  3. ^ Сони, Девин (31 июля 2019 г.). «Что такое синглтон?» . Лучшее программирование . Проверено 28 августа 2021 г.
  4. ^ Райнсбергер, Дж. Б. (1 июля 2001 г.). «Используйте синглтоны с умом» . ИБМ. Архивировано из оригинала 24 февраля 2021 года . Проверено 28 августа 2021 г.
  5. ^ Скотт Мейерс (1997). Более эффективный C++ . Эддисон Уэсли. стр. 146 и далее. ISBN  0-201-63371-Х .
  6. ^ Эрик Фриман, Элизабет Фриман, Кэти Сьерра и Берт Бейтс (октябрь 2004 г.). «5: Единственные в своем роде объекты: шаблон Singleton» . Шаблоны проектирования Head First (первое изд.). О'Рейли Медиа, Инк. с. 182. ИСБН  978-0-596-00712-6 . {{cite book}}: CS1 maint: несколько имен: список авторов ( ссылка )
  7. ^ «Почему синглтоны вызывают споры» . Архив кода Google . Архивировано из оригинала 6 мая 2021 года . Проверено 28 августа 2021 г.
  8. ^ Jump up to: а б с Баттон, Брайан (25 мая 2004 г.). «Почему синглтоны — зло» . Быть Скоттом Денсмором . Майкрософт. Архивировано из оригинала 15 июля 2021 года . Проверено 28 августа 2021 г.
  9. ^ Стив Йегге. Одиночек считают глупыми , сентябрь 2004 г.
  10. ^ Хевери, Мишко, « Глобальное состояние и синглтоны », Clean Code Talks , 21 ноября 2008 г.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 04371413d69fd6723b049b28e6931cae__1711479900
URL1:https://arc.ask3.ru/arc/aa/04/ae/04371413d69fd6723b049b28e6931cae.html
Заголовок, (Title) документа по адресу, URL1:
Singleton pattern - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)