- 1. Goals
- 2. Problems
- 3. Discussion
- 4. Structure
- 5. Example
- 6. Control List
- 7. Rules of thumb
Goals
- Make sure the class has only one instance and provides a global access point to it.
- 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
- Define a private static attribute in the "Sigleton" class.
- Define a public static access function in the class.
- Do "lazy initialization" (creation on first use) in the accessor function.
- Define all constructors as private or protected.
- 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.