Twitter Youtube Github
Burak Kutbay'ın Kişisel Blog'u |

Type and hit Enter to search

  • Eğitim
  • Quarkus
  • Spring Cloud
  • Spring Boot
  • Spring JDBC Template
  • Spring MVC
  • Spring Core
  • Spring Örnekleri
  • Hibernate
  • Java Server Pages
  • Java Server Faces
  • PrimeFaces
  • Servlet
  • JDBC
  • JSTL
  • Java 8
  • / Diğer
    • Ünlü Bilişimciler
    • C Sharp
    • Kütüphane
    • Makale
Design Patterns

Design Patterns – Singleton Pattern Nedir?

Paylaş

Bu yazıda SingletonPattern nedir? Hangi amaç ile kullanılır? Ne gibi durumlarda kullanmamız gerekir? Konularından bahsedeceğim.

İçindekiler

  • Eager Initialization
  • Static Block Initialization
  • Lazy Initialization
  • Lazy Initialization ve Double Check Locking
  • Bill Pugh Singleton
  • Thread Safe Singleton

Yapacağımız uygulamada bir sınıfımızdan sadece bir nesne oluşturulmasını sağlamak istediğimizde uygulayacağımız Design Pattern, Singleton Pattern’dir. Uygulamamızda oluşturacağımız bu nesne Singleton Pattern sayesinde ikinci bir nesnenin oluşturulmasını engelleyecektir.

Uygulamamızda ne gibi durumlarda kullanılmalı diye soracak olursanız uygulama ayarları gerektiren işlemlerde, bağlantı işlemlerinde kullanılabilmektedir.

Örnek bir uygulama yapalım. Uygulamamız tek bir nesne üretecek ve ikinci kez üretilmesini engelleyecek Singleton Pattern örneği olacak.

Singleton Pattern yaparken farklı yaklaşımlar mevcuttur. Bu farklı yaklaşımları örnekler üzerinde inceleyeceğiz.

Eager Initialization

Bu yaklaşımımızda uygulamamız ayağa kalkarken nesnemiz oluşturulmaktadır.

public class SingletonOrnek {

    private static SingletonOrnek nesne = new SingletonOrnek();

    private SingletonOrnek() {
    }

    public static SingletonOrnek getNesne() {
        return nesne;
    }
}

Classımızda oluşan nesnemiz uygulama oluşturulduğunda bir değişken oluşturulur.

Static Block Initialization

Eager Initialization’un aynısı diyebiliriz. Uygulama başladığında nesnemiz oluşturulur ancak burada oluşturulmuş ya da oluşturalacak nesnemiz üzerinde kontrol mekanizması oluşturabiliriz.

public class SingletonOrnek {

    private static SingletonOrnek nesne;

    static { 
       try {
           nesne= new SingletonOrnek();
           } catch (IOException e) {
              throw new RuntimeException("Hata", e);
           }
    }
    
    private SingletonOrnek() {
    }

    public static SingletonOrne getNesne() {
        return nesne;
    }
}

Static bir nesne oluşturarak hata işlemlerini yakalabilmekteyiz.

Lazy Initialization

Bu Singleton Pattern yaklaşımında nesnemiz biz isteğimiz zaman oluşturulmakta ve aynı nesnenin oluşup oluşmadığı kontrol ederek eğer oluşmadıysa nesnenin oluşturulmasını sağlamaktayız.

public class SingletonOrnek {

private static SingletonOrnek nesne;

    private SingletonOrnek() {
    }

    public static SingletonOrnek getNesne() {
      if (null == nesne) {
          nesne= new SingletonOrnek();
       }
      return nesne;
    }
}

Bu sayede “aynı nesnenin ikinci kez” oluşturulmasının da önüne geçiyoruz.

Lazy Initialization ve Double Check Locking

Uygulamamızda Lazy Initialization yapısı kullanarak bir Singleton Pattern oluşturduk. Uygulamamızda ikinci kez nesnemizin oluşturulmasını engellemek için kontrol mekanizmasını genişlettiğimiz yaklaşımdır.

public class DoubleCheckedLocking {

	private volatile static DoubleCheckedLocking nesne;

	private DoubleCheckedLocking() {
        }

	public static DoubleCheckedLocking getNesne() {
		if (nesne== null) {
			synchronized (DoubleCheckedLocking.class) {
				if (nesne == null) {
					nesne = new DoubleCheckedLocking();
				}
			}
		}
		return nesne;
	}
}

Bill Pugh Singleton

Bu yaklaşımda static nested class oluşturarak nesnemizin üretilmesini sağlamaktayız.

public class SingletonBillPugh {
 
    private SingletonBillPugh() {
    }
 
    private static class SingletonHolder {
        public static final SingletonBillPugh nesne = new SingletonBillPugh();
    }
 
    public static SingletonBillPugh getInstance() {
        return SingletonHolder.instance;
    }
}

Thread Safe Singleton

Bu yaklaşımda uygulamamıza birden çok aynı anda nesne oluşturulması işleminde aynı anda istek gelse bile sadece birtanesinin işlenmesi sonra diğerini işleme alarak nesnemiz oluştuysa tekrar oluşturulmasını engellemek için yapıtığımız bir Singleton Pattern yaklaşımıdır.

public class ThreadSafeSingleton {

    private static ThreadSafeSingleton nesne;
    
    private ThreadSafeSingleton(){}
    
    public static synchronized ThreadSafeSingleton getNesne(){

        if(nesne== null){
            nesne = new ThreadSafeSingleton();
        }
        return nesne;
    }
    
}

Bu yaklaşımda uygulamamızda bu nesne için oluşturmak isteyen birden fazla isteği synchronized yaparak sıraya sokuyoruz ve oluşmadı ise nesnemizi oluşturuyoruz.

Tags:

Bill Pugh Singletondesign patternDouble Check LockingEager InitializationLazy InitializationSingleton Patterntasarım kalıplarıThread Safe Singleton

Paylaş

Diğer Yazılar

Previous

Design Pattern – Factory Pattern Nedir?

blank
Next

Design Patterns – Prototype Pattern Nedir?

Next
blank
15 Şubat 2018

Design Patterns – Prototype Pattern Nedir?

Previews
13 Şubat 2018

Design Pattern – Factory Pattern Nedir?

blank

2 Comments

  1. Ali dedi ki:
    03 Nisan 2018, 21:53

    Eager’i TypeScript ile şöyle denedim. Olmuş mu? (:

    class SingletonExample {
    private static nesne = new SingletonExample();

    private SingletonExample() {

    }

    public static getNesne() {
    return this.nesne
    }

    public getPlayer() {
    console.log(“Player”);
    }
    }

    class TestSingleton {
    constructor() {
    var ref = SingletonExample.getNesne();

    ref.getPlayer();
    }
    }

    new TestSingleton();

    Cevapla
  2. Ünal dedi ki:
    04 Nisan 2019, 22:10

    Allah köməyiniz olsun. Çox gözəl izah etmisiniz!

    Cevapla

Bir cevap yazın Cevabı iptal et

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

İlgini Çekebilir

blank

Design Patterns – Template Metot Pattern Nedir?

blank

Design Patterns – Builder Pattern Nedir?

blank

Design Patterns – Prototype Pattern Nedir?

blank

Design Pattern – Factory Pattern Nedir?

Burak Kutbay'ın Kişisel Blog'u |

© 2008 - ∞, Her hakkı saklıdır.

Link

  • Hakkımda
  • İletişim
  • Arşiv

Kategori

Cloud
Amazon Web Services
Vue.js
Gradle
Node.js
Android
Struts
Redis
Röportaj
Spring Data
Spring Cloud Stream
XCode
Debezium
Mikroservis Mimarisi
Video
Spring Native
iPhone Uygulama Geliştirme
Objective C
JPA
Spring Security
PostgreSQL
Apache Kafka
Git
Servlet
Yaptığım Projeler
Maven
Design Patterns
DevOps
Linux
RabbitMQ
PrimeFaces
JDBC
Spring Jdbc Template
Spring
Spring MVC
Manset
Google
Spring Cloud
OCA Java SE 8
Spring Core
Quarkus
Microsoft
Tanıyalım
Veritabanı
Java SE
Hibernate
Teknoloji
Okuduğum Kitaplar
Java Server Faces
Yazılım Mühendisliği
C Sharp
Spring Boot
Java
Günlüğüm
Java Server Page
Makale

Takip Et

Twitter Youtube Github
  • Eğitim
  • Quarkus
  • Spring Cloud
  • Spring Boot
  • Spring JDBC Template
  • Spring MVC
  • Spring Core
  • Spring Örnekleri
  • Hibernate
  • Java Server Pages
  • Java Server Faces
  • PrimeFaces
  • Servlet
  • JDBC
  • JSTL
  • Java 8
  • / Diğer
    • Ünlü Bilişimciler
    • C Sharp
    • Kütüphane
    • Makale