Singleton Design Pattern

Singleton design pattern, sınıftan nesne türetilirken sadece 1 instance (örnek) oluşturulmasını esas alır. Her nesne oluşturma istediğinizde size daha önce oluşturulan nesne döndürülür.

Singleton design pattern, oluşturacağınız sınıfları hunharca kullanmanızı önler. Basit bir get, set işlemi için bile new operatörüyle yeni nesne oluşturan geliştiriciler, bu mimariyle neye uğradıklarını şaşırırlar.

Bu mimariye en iyi ve en genel örnek veri tabanı sınıfıdır. Bir sayfaya istek yaptığınızda, veri tabanı işlemleri için arka planda sadece 1 nesne oluşturulur. Bu şekilde fazla bellek işgal etmeden tüm veri tabanı işlemleri yapılmış olur.

PHP ile Singleton Design Pattern

class Database
{
	private static $instance;
	public static function instance()
	{
		if(!self::$instance) {
			self::$instance = new static();
		}
		return self::$instance;
	}
	private function __construct()
	{
		// Open a DB connection
		echo "Hello MySQL, Im PHP. Your best friend.";
	}
	private function __clone()
	{
	}
}

Singleton design pattern, static bir fonksiyon ve static bir değişken kullanır. Static değişken, oluşturulan ya da oluşturulacak nesne örneğini tutar. Static fonksiyon ise logic (mantıksal) kısmı üstlenir. Fonksiyon, eğer sınıfa ilk kez nesne türetme isteği yapılıyorsa yeni nesne türetir, eğer ilk kez değilse daha önceden oluşturduğu nesneyi döndürür.

// Nesne türetme isteği ile yeni bir nesne türetilir.
$db1 = Database::instance();
// Nesne türetme isteği ile yukarıda oluşturulan nesne döndürülür.
$db2 = Database::instance();
// Dolayısıyla
if ($db1 === $db2) // TRUE

Yani Database sınıfının instance() fonksiyonunu kaç kere çağırırsanız çağırın, sürekli yeni nesne türetilmeyecek ve hep aynı nesneyi döndürülecektir.

// Private olan construct fonksiyonu çağrılamaz, hata oluşutur
$db2 = new Database();
// Private olan clone fonksiyonu çağrılamaz, hata oluşur
$db3 = clone($db2);

Singleton design pattern kullanmak için __construct fonksiyonunu private olarak tanımlamamız gerekiyor. Aynı şekilde __clone fonksiyonunu da private olarak tanımlarsak, sadece instance fonksiyonu üzerinden yeni nesne türetme imkanı vermiş olacağız.

Benzer Yazılar

Yorumlar

Yorum Yazın

Su elementleri kullanabilirsiniz : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Arama
RSS
Beni yukari isinla