Singleton (yalnızlılık) tasarım şablonuna bir sınıfın sadece bir kez kullanılacağı durumlarda başvurulur. Bunu sağlamak için ise nesnenin yapılandırıcı metodu ( constructor ) private yapılır ve nesneyi oluşturacak başka bir public method yazılır. Nesne oluşturmak için çağırılacak metodun içinde nesnenin daha önce oluşturulup oluşturulmadığı kontrol edilir. Bu tasarım şablonunun en çok database sınıflarında kullanıldığını görürüz. Mysql connect fonksiyonu bir kere çalıştırılır ve program boyunca bir daha oluşturulmaz.

Şimdi bir örnekle yukarıda yazdıklarımız anlamaya çalışalım.
A ve B diye 2 tane sınıf oluşturuyoruz. Bu sınıfları singleton tasarım şablonu ile çağıracağız.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class A { static function getir() { echo "A->getir();"; } } class B { static function getir() { echo "B->getir();"; } } |
şimdi singleton sınıfımızı oluşturalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | class Singleton { private static $_instance = array(); // yapılandırıcı method private olarak tanımladık. nedeni dışarıdan erişimi engellemek private function __construct (){} static function getInstance($sinif) { // sınıfın daha önce oluşturup oluşturulmadığını kontrol ediyoruz if(empty(self::$_instance[$sinif])) { self::$_instance[$sinif] = new $sinif; echo $sinif.' sınıfı oluşturuldu'; } return self::$_instance[$sinif]; } } ?> |
şimdide sınıfı nasıl kullanacağımıza bakalım
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | writeln('A SINIFINI OLUŞTUR'); $singleton = Singleton::getInstance('A'); writeln(''); $singleton->getir(); writeln(''); writeln(''); writeln('A SINIFINI TEKRAR OLUŞTUR'); $singleton = Singleton::getInstance('A'); $singleton->getir(); writeln(''); writeln(''); writeln('B SINIFINI OLUŞTUR'); $singleton = Singleton::getInstance('B'); writeln(''); $singleton->getir(); ?> |
Bu uygulamanın ekran çıktısı ile şu şekildedir.
A SINIFINI OLUŞTUR
A sınıfı oluşturuldu
A->getir();A SINIFINI TEKRAR OLUŞTUR
A->getir();B SINIFINI OLUŞTUR
B sınıfı oluşturuldu
B->getir();
Yukarıdaki ekran çıktısında da anlaşılıyorki, A sınıfını tekrar türetmek istediğimizde sınıf var olduğu için bize direk sınıfı çağırıyor.
Buna ek olarak sınıfın kopyalanmasını engellemek için _clone() fonksiyonunu kullanabiliriz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | <?php class A { static function getir() { echo "A->getir();"; } } class B { static function getir() { echo "B->getir();"; } } class Singleton { private static $_instance = array(); // yapılandırıcı method private olarak tanımladık. nedeni dışarıdan erişimi engellemek private function __construct (){} static function getInstance($sinif) { // sınıfın daha önce oluşturup oluşturulmadığını kontrol ediyoruz if(empty(self::$_instance[$sinif])) { self::$_instance[$sinif] = new $sinif; echo $sinif.' sınıfı oluşturuldu'; } return self::$_instance[$sinif]; } public function __clone() { die("sadece bir kez olusturabilirsin."); } } function writeln($line_in) { echo $line_in.'<br/>'; } writeln('A SINIFINI OLUŞTUR'); $singleton = Singleton::getInstance('A'); writeln(''); $singleton->getir(); writeln(''); writeln(''); writeln('A SINIFINI TEKRAR OLUŞTUR'); $singleton = Singleton::getInstance('A'); $singleton->getir(); writeln(''); writeln(''); writeln('B SINIFINI OLUŞTUR'); $singleton = Singleton::getInstance('B'); writeln(''); $singleton->getir(); ?> |
dosya : singleton design pattern
Unutulmamalıdırki çoğu tasarım şablonu singleton tasarım şablonunu kullanmaktadır. Yani bir tasarım şablonu kullanmak diğerlerini kullanmamak anlamına gelmemektedir. Aşağıdaki verdiğim örnekleri inceleyip farklı çözüm yollarına ulaşabilirsiniz.
dosya : OReily : singleton design pattern
dosya : Chris Strosser : singleton design pattern
dosya : Simon István : singleton design pattern
benzer konular:














design patterns