blog

Home / DeveloperSection / Blogs / JAVA : Singleton Pattern

JAVA : Singleton Pattern

Tarun Kumar 3651 02-Jul-2015

Previously we have seen how to create Dynamic Objective Test Application through Swing in JAVA : Creating Dynamic Objective Test Application through Swing in JAVA ( Using MySQL Database ) 

The Singleton's purpose is to control object creation, limiting the number of objects to one only. Since there is only one Singleton instance, any instance fields of a Singleton will occur only once per class, just like static fields. Singletons often control access to resources such as database connections or sockets.

Singleton pattern is one of the simplest design patterns in Java. This type of design pattern comes under creational pattern as this pattern provides one of the best ways to create an object.

[ Sometimes it's appropriate to have exactly one instance of a class: window managers, print spoolers, and file systems are prototypical examples. Typically, those types of objects—known as singletons—are accessed by disparate objects throughout a software system, and therefore require a global point of access. ]

Singleton Design Pattern Diagram:

JAVA : Singleton Pattern

The Singleton design pattern addresses all of these concerns. With the Singleton design pattern you can:

  • Ensure that only one instance of a class is created
  • Provide a global point of access to the object
  • Allow multiple instances in the future without affecting a singleton class's clients


Singleton Pattern: Code

public class ClassicSingleton {

   private static ClassicSingleton instance = null;
   protected ClassicSingleton() {
      // Exists only to defeat instantiation.
   }
   public static ClassicSingleton getInstance() {
      if(instance == null) {
         instance = new ClassicSingleton();
      }
      return instance;
   }
}

The ClassicSingleton class maintains a static reference to the one singleton instance and returns that reference from the static getInstance() method. 

ClassicSingleton employs a technique known as lazy instantiation to create the singleton; as a result, the singleton instance is not created until the getInstance() method is called for the first time. This technique ensures that singleton instances are created only when needed.

Notice that ClassicSingleton implements a protected constructor so clients cannot instantiate ClassicSingleton instances;

For completeness, here is how a client can access the Singleton:

//access the singleton

Singleton singleton = Singleton.getInstance();
//use the singleton


Watch Out for the Downsides:

An important consideration is multi-threading. If two threads call the getInstance() method at the same time, you can end up with two singletons. Making the getInstance() method synchronized solves this issue, but then you have the performance cost - calling a synchronized version of getInstance() will be slower than the non-synchronized version. However, maybe the best way around this is to sacrifice lazy-loading in the Singleton, ensuring there can only ever be on the instance.

Next, we will learn about: JAVA - Factory Pattern 


Updated 24-Feb-2018

Leave Comment

Comments

Liked By