Singleton Design Pattern
Singleton Pattern -> restricts the instantiation of a class to one object.
- Ensure a class only has one instance and provide a global point of access to it.Eg: DB Connection needs to be a singleton
- It is used to control the number of objects created by preventing external instantiation and modification.
- This is useful when exactly one object is needed to coordinate actions across the system.
How ?
- private constructor - so that no other class can instantiate a new object.
class SingletonDemo {
    ....
    private SingletonDemo() {
    }
}
- private reference or instance - no external modification.
    //private static SingletonDemo singletonDemo = new SingletonDemo();//Eager Evaluation
    private static SingletonDemo singletonDemo;//Eager Evaluation
- public static method (get()/of()/getInstance() - convention) is the only place that can get an object.
Eager Evaluation
//Lazy mode
public static SingletonDemo of(){
    if(null == singletonDemo){
        System.out.println("First time call");
        singletonDemo = new SingletonDemo();//Preventing from creating multiple instances
    }
    return singletonDemo;
}
Lazy Evaluation
private static final SingletonDemo singletonDemo = new SingletonDemo();//Eager Evaluation
There are four different ways to create objects in java:
- Using new keyword
- Using Class.forName()://reflection
- Using clone():
- Using Object Deserialization: Using new Intance() method
Private constructor doesn’t protect from instantiation via reflection.
Joshua Bloch (Effective Java) proposes a better implementation of Singleton
//This ENUM acts as a singleton bean
public enum SingletonDemoEnum {
    //INSTANCE;
    INSTANCE();
    public String doSomething(){
        return "Do something inside Enum";
    }
}
Access thew singleton object via
SingletonDemoEnum object = SingletonDemoEnum.INSTANCE;//TODO: Whats is INSTANCE