www.fatihkabakci.com

Personal Website and Computer Science TUR EN

SINGLETON DESIGN PATTERN

Last update: 10/7/2014 10:34:00 PM

Yazan:Fatih KABAKCI

Creational(Yaradılış) paternlerinden biri olan Singleton Tasarım Deseni(Design Pattern) bir sınıftan yalnızca tek bir nesne oluşturulması gerektiği durumlarda kullanılan bir modeldir. Singleton Gang Of Four' un ortaya çıkardığı bir tasarım desenidir.

Singleton Tasarım Desenine ihtiyaç duyulacak tek bir neden vardır ki, oda singleton nesnesinin sistem içerisinde yalnızca bir kez oluşturulma gereksinimidir. Buna örnek olarak bir web sayfasının ilk kez yüklenirken yapması gereken veritabanı işlemleri verilebilir.

Aşağıda Singleton Tasarım Deseninin genel formu verilmektedir.

Yukarıda gösterildiği gibi Singleton iskeleti, farklı implementasyonlar ile oluşturulabilse de temel olarak 3 operasyon her zaman yapılmalıdır.
  1. Singleton sınıfına, aynı sınıf adı ile static üye değişken tanımlanmalıdır.
  2. Kurucu metot(Constructor) private tanımlanmalıdır.
  3. Singleton nesnesini döndüren public static bir metot tanımlanmalıdır.
Genel anlamda bir Singleton yapısı Lazy Tanımlaması olarak adlandırılan aşağıdaki yapı ile oluşturulmaktadır. Genel mimari örneği Java Programlama Dilinde gösterilmiştir. Singleton tasarım deseni farklı şekillerde oluşturulabilmektedir. Aşağıda her bir tasarımın anlatımı yapılacaktır.
package Singleton;

/**
 * 
 * @author www.fatihkabakci.com
 * @summary The skeleton of Singleton
 */
public class Singleton {

   private static Singleton singleton;

   private Singleton() {
      // constructor is private
   }

   public static Singleton getInstance() {

      if (singleton == null) {
         return singleton = new Singleton();
      }
      return singleton;
   }
}

Eager Initilization

Eager Initilization singleton nesnesinin deklare edildiği anda new anahtar kelimesi ile create edildiği formasyonuna verilen addır.
package Singleton.V2;

/**
 * 
 * @author www.fatihkabakci.com
 * @summary Eager Initilization of the skeleton of Singleton
 */
public class Singleton {

   private static Singleton singleton = new Singleton();

   private Singleton() {
      // constructor is private
   }

   public static Singleton getInstance() {

      return singleton;
   }
}
Eager tanımlama, şayet kullanılacak singleton nesnesinin oluşturulması çok maliyetli değil ise, yani nesnenin içerdiği bayt miktarı kapasite açısından sistemi sınırlandırmıyor ise kullanılabilir. Aksi halde sınıfın her load sürecinde nesneyi yeniden oluşturmak zaman ve kaynak açısından tavsiye edilmez.

Lazy Initilization

Eager'ın tersine Singleton nesnesinin deklare edildikten sonra, örneğinin get edildiği metodun içerisinde tanımlandığı haline verilen addır.
package Singleton.Lazy;

/**
 * 
 * @author www.fatihkabakci.com
 * @summary The lazy of the skeleton of Singleton
 */
public class Singleton {

   private static Singleton singleton;

   private Singleton() {
      // constructor is private
   }

   public static Singleton getInstance() {

      if (singleton == null) {
         return singleton = new Singleton();
      }
      return singleton;
   }
}
Lazy tanımlaması, Singleton mimarisinin klasik iskeletini oluşturur. Bu yapı şayet oluşturacak Singleton nesnesinin sahip olduğu veri hacmi çok büyük ise tavsiye edilmektedir.

Thread Safe(Güvenli Thread)

Bu versiyon, oluşturulacak Singleton nesnesi şayet Multi-Threading bir ortamda paylaşılıyor ise, tavsiye edilmektedir. Uygulamada Singleton nesnesinin döndürüldüğü metodun başına synchronized anahtar kelimesi getirilir. Böylelikle bir den fazla Thread tarafından paylaşılan Singleton nesnesi, güvenli bir şekilde gereksiz tekrar yüklemelerinden kurtulmuş olur. Bu anlamda güvenli thread yapısı sağlanmış olur. Bunun literatürdeki anlamı ise double checking locking dir. Yani bir thread scheduler tarafından bloklanarak, yerini başka bir thread'e bırakması durumunda, Singleton nesnesinin daha önceden oluşturulup oluşturulmadığı bir kez daha denetlenir.

Aşağıda Thread Safe iskelet yapısı gösterilmektedir.
package Singleton.ThreadSafe.V1;

/**
 * 
 * @author www.fatihkabakci.com
 * @summary The Thread Safe of the skeleton of Singleton
 */
public class Singleton {

   private static Singleton singleton;

   private Singleton() {
      // constructor is private
   }

   public static synchronized Singleton getInstance() {

      if (singleton == null) {
         return singleton = new Singleton();
      }
      return singleton;
   }
}
Bazı yerlerde Thread Safe iskeleti aşağıdaki gibi de dizayn edilebildiği görülmektedir.
package Singleton.ThreadSafe.V2;

/**
 * @author www.fatihkabakci.com
 * @summary The Thread Safe of the skeleton of Singleton
 */
public class Singleton {

   private static Singleton singleton;

   private Singleton() {
      // constructor is private
   }

   public static Singleton getInstance() {

      if (singleton == null) {
         synchronized (Singleton.class) {
            if (singleton == null) {
               return singleton = new Singleton();
            }
         }
      }
      return singleton;
   }
}
Yukarıdaki modelde synchronized anahtar kelimesi metot başlığından çıkarılıp, gövde içerisinde blok olarak tanımlandığı görülmektedir. Bu bloktan sonra yazılan ikinci if koşul bloğu double checked locking anlamındadır. Bunun anlamını bir kez daha söylemek gerekirse, synchronized bloğundan önce askıya alınan thread'in, bu bloktan sonra tekrardan çalıştığında, Singleton nesnesinin oluşturup oluşturulmadığının kontrölünün yapılmasına ihtiyaç duyulmasıdır.

Static Blok Initilization

Bilindiği üzere Java Programlama Dilinde Statik Bloklar bir sınıf içerisinde bir kez çalıştırılıp, daha sonra hiç bir zaman çalışmayan kod parçalarıdır. Singleton doğasına çok uydukları içinde bu mimarinin tanımlanmasında da kullanılabilmektedirler. Aşağıda statik blok tanımlaması ile oluşturulan bir Singleton nesnesi gösterilmektedir.
package Singleton.StaticBlock;

/**
 * @author www.fatihkabakci.com
 * @summary The Static Block of the skeleton of Singleton
 */
public class Singleton {

   private static Singleton singleton;

   static {
      try {
         singleton = new Singleton();
      }
      catch (RuntimeException e) {
      }
   }

   private Singleton() {
      // constructor is private
   }

   public static Singleton getInstance() {
      return singleton;
   }
}

Bill Pugh Yapısı

Bu yapıda da, Singleton nesne oluşumu için iç yardımcı bir sınıftan(inner helper class) yararlanılır.Temel yapısı aşağıdaki gibidir.
package Singleton.BillPugh;

/**
 * 
 * @author www.fatihkabakci.com
 * @summary The Bill Pugh of the skeleton of Singleton
 */
public class Singleton {

   private Singleton() {
      // constructor is private
   }
   
   // SingletonHelper is helper class to create the singleton object
   private static class SingletonHelper {
      private static final Singleton singleton = new Singleton();
   }

   public static Singleton getInstance() {
      // the object of SingletonHelper from Singleton.getInstance
      return SingletonHelper.singleton;
   }
}

Java Enum

Java Enum'lar da doğası gereği bir kez oluşturulup değer verildikten sonra, global olarak kullanılabilen Singleton nesneler olarak adlandırılır. Bu sebebten ötürü Enum'lar da Singleton tasarım deseni olarak kullanılabilmektedir.
package Singleton.Enum;

/**
 * 
 * @author www.fatihkabakci.com
 * @summary Enum structure of the skeleton of Singleton
 */
public enum Singleton {
   INSTANCE;
   
   public static Singleton getInstance() {
      return INSTANCE;
   }
}

Yukarıda anlatılanların dışında referans Constructor nesneleri üzerinden oluşturulan Reflection tekniği,Serializable interface'ler aracılığı ile oluşturulan yapıları da mevcuttur.

Singleton tasarım deseni, bir çok sistem tarafından paylaşılan bir kaynak olması, merkezden yönetilebilmesi yani tek bir instance ile takibinin kolay ve yönetilebilir olması,kolay uygulanabilir ve anlaşılabilir olması artıları olarak gösterilirken, hiç bir sınıfı extend edemeyecek olması, yani hiç bir sınıfın bir alt sınıfı olamayışı, kurucu metodunun parametre alamayışından dolayı programın esnekliğini azalttığı ve karmaşasını arttırdığı gibi negatif yönleride bulunmaktadır. Özet olarak Singleton tasarım deseni en basit ve en sık kullanılan paternlerden bir tanesidir. Bir sınıftan yalnızca ve yalnızca 1 adet nesne üreterek kullanmanız gerektiği durumlarda Singleton tasarım desenini kullanabilirsiniz.

There has been no comment yet

Name:


Question/Comment
   Please verify the image




The Topics in Computer Science

Search this site for





 

Software & Algorithms

icon

In mathematics and computer science, an algorithm is a step-by-step procedure for calculations. Algorithms are used for calculation, data processing, and automated reasoning.

Programming Languages

icon

A programming language is a formal constructed language designed to communicate instructions to a machine, particularly a computer. It can be used to create programs to control the behavior of a machine. Java,C, C++,C#

Database

icon

A database is an organized collection of data. The data are typically organized to model aspects of reality in a way that supports processes requiring information.

Hardware

icon

Computer hardware is the collection of physical elements that constitutes a computer system. Computer hardware refers to the physical parts or components of a computer such as the monitor, memory, cpu.

Web Technologies

icon

Web development is a broad term for the work involved in developing a web site for the Internet or an intranet. Html,Css,JavaScript,ASP.Net,PHP are one of the most popular technologies. J2EE,Spring Boot, Servlet, JSP,JSF, ASP

Mobile Technologies

icon

Mobile application development is the process by which application software is developed for low-power handheld devices, such as personal digital assistants, enterprise digital assistants or mobile phones. J2ME

Network

icon

A computer network or data network is a telecommunications network that allows computers to exchange data. In computer networks, networked computing devices pass data to each other along data connections.

Operating Systems

icon

An operating system is software that manages computer hardware and software resources and provides common services for computer programs. The OS is an essential component of the system software in a computer system. Linux,Windows

Computer Science

icon

Computer science is the scientific and practical approach to computation and its applications.A computer scientist specializes in the theory of computation and the design of computational systems.