Singleton – Tasarım Kalıpları

Merhaba, evet kendisi en çok kullanılan tasarım kalıbı sanırım. Elinizi attığınız her projede kullanılan bir kalıp. Singleton, Tekillik olarak çevrilebilir. Bu tasarım kalıbı, bir sınıftan sadece bir nesne oluşturulması ve bu nesnenin tüm sistemlerde kullanılması durumunda ihtiyaç duyulur. Şimdi bir Singleton örnek kodunu görelim.

Singleton.java

package com.patterns.singleton;

/**
 * Created by ufuk on 19.8.2016.
 */
public class Singleton {

    private static Singleton instance = null;
    private static Object lock = new Object();

    private Singleton() {
        //private constructor
    }

    public static Singleton instance() {
        if (instance == null) {
            synchronized (lock) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }

    public void println() {
        System.out.println(this);
    }
}

Örneği incelediğimizde bir Singleton sınıfında olması gerekenler:
1- Private bir constructor, böylece bu sınıftan new operatörü ile nesne oluşturulması önüne geçilir.
2- Sadece bir nesne oluşturulmasını istediğimiz için nesneyi static olarak tanımlama
3- Sadece bir nesne oluşturabilmek için static olarak tanımlanmış bir instance() metodu

Yukarıdaki kodda instance metodunda  synchronized kullanarak tek bir nesne oluşturulmasını garanti etmiş olduk. Bu double checking ‘in nedeni Java‘nın  multi threaded bir sistem olması durumu. Main sınıfımızda da for içinde instance metodunu 10 kere çağıralım.

Main.java

package com.patterns;

import com.patterns.singleton.Singleton;

public class Main {

    public static void main(String[] args) {
        for (int i=0; i<10; i++) {
            Singleton.instance().println();
        }
    }
}

Çıktı : 
com.patterns.singleton.Singleton@610455d6
com.patterns.singleton.Singleton@610455d6
com.patterns.singleton.Singleton@610455d6
com.patterns.singleton.Singleton@610455d6
com.patterns.singleton.Singleton@610455d6
com.patterns.singleton.Singleton@610455d6
com.patterns.singleton.Singleton@610455d6
com.patterns.singleton.Singleton@610455d6
com.patterns.singleton.Singleton@610455d6
com.patterns.singleton.Singleton@610455d6

Evet, görüldüğü gibi Singleton sınıfından sadece bir nesne oluştuğunu görebiliyoruz. Ancak Singleton tasarım kalıbının günümüzde Anti-Pattern durumu var. Bunun sebebi de sınıf constructor‘ının private olmasından dolayı, singleton nesnelerinin zor test edilmesinden dolayıdır.

Şimdilik bu kadar, görüşmek üzere…

O mükemmel değil. Sen de mükemmel değilsin. Asıl soru birbiriniz için mükemmel olup olmadığınız. (Good Will Hunting)

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s