Evgenii Legotckoi
Sept. 20, 2018, 7:33 p.m.

Generative Design Patterns - Singleton

Goals

  1. Make sure the class has only one instance and provides a global access point to it.
  2. Encapsulated "initialization at a certain point in time" or "initialization on first use".

Problems

An application needs one and only one object instance. In addition, lazy initialization and global access are required.


Discussion

Make the object class responsible for creating one single instance, initializing it, accessing it, and enforcing it. Declare an instance as a private static data member. Provide a public static member function that encapsulates all initialization code and provides access to the instance.

The client calls the accessor function (using the class name and scope resolution operator) when a reference to a singleton object is required.

A singleton should only be considered if all three of the following criteria are met: Ownership of a single instance cannot reasonably be assigned

  • Ownership of a single instance cannot reasonably be assigned to any objects
  • Desirable lazy initialization
  • Global access is not provided

If one of the conditions is not met, then the Singleton is not particularly interesting.

The Singleton pattern can be extended to support access to an application-specific number of instances.

Structure

Make the instance's Singleton class responsible for access and "initialization on first use". The single instance is a private static attribute. The accessor function is a public static method.

Example

The Singleton pattern ensures that a class has only one instance and provides a global access point to that instance. It is named after the singleton set, which is defined as a set containing one element. The Office of the President of the United States is Singleton. The United States Constitution determines the means by which the President is elected, limits the term of office, and determines the order of succession. As a result, there can be at most one incumbent president at any given time. Regardless of the identity of the incumbent, the title "President of the United States" is a global hotspot that identifies a person in an office.

Control List

  1. Define a private static attribute in the "Sigleton" class.
  2. Define a public static access function in the class.
  3. Do "lazy initialization" (creation on first use) in the accessor function.
  4. Define all constructors as private or protected.
  5. Clients can only use the access function to work with Singleton.

Rules of thumb

  • Abstract Factory, Builder and Prototype can use Singleton in their implementation.
  • Facade objects are often singletons because only one Facade object is required.
  • State objects are often singletons.
  • The advantage of Singleton over globals is that you are absolutely sure of the number of instances when using Singleton and you can also change the code to manage any number of instances.
  • The Singleton design pattern is one of the more unmanageable patterns. Singletons are meant to be used when a class must have exactly one instance, no more, no less. Developers often use Singletons in a misguided attempt to replace global variables. Singleton won't do away with global variables; it just renames them.
  • When is a Singleton not needed? Short answer: most of the time. Long answer: When is it easier to pass an object's resource as a reference to the objects that need it, rather than let the objects access the resource globally. The real problem with Singletons is that they give you such a good excuse not to think about the corresponding object visibility. Finding the right balance of exposure and object protection is critical to maintaining code flexibility.

Do you like it? Share on social networks!

Comments

Only authorized users can post comments.
Please, Log in or Sign up
  • Last comments
  • Evgenii Legotckoi
    March 9, 2025, 9:02 p.m.
    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
  • VP
    March 9, 2025, 4:14 p.m.
    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
  • ИМ
    Nov. 22, 2024, 9:51 p.m.
    Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
  • Evgenii Legotckoi
    Oct. 31, 2024, 11:37 p.m.
    Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
  • A
    Oct. 19, 2024, 5:19 p.m.
    Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html