25 / 06 / 2009

singleton design pattern – php

ekleyen: Emre Çevik kategori: design patterns| php

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.


singleton

Ş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
  • Digg
  • del.icio.us
  • Facebook
  • Google
  • BlinkList
  • blogmarks
  • description
  • Furl
  • Ma.gnolia
  • NewsVine
  • Reddit
  • Technorati

benzer konular:

  1. builder design pattern – php
  2. prototype design pattern – php
  3. adapter design pattern – php
  4. factory method design pattern – php
  5. proxy design pattern – php
  6. visitor design pattern – php
  7. state design pattern – php
  8. facade design pattern – php
  9. strategy design pattern – php
  10. bridge design pattern – php


(2 votes, average: 5.00 out of 5)
Loading ... Loading ...

9 yorum

1 | Omer

25 / 06 / 2009 - 19:03

Avatar

Şuanda nesne yonelimli ve mvc kalibini yeni yeni kullanmaya başladim, harika bir yapı gercekten , mantıgını anlamaya calışıyorum gun be gun. Burda sıkıntım aşağıdaki modeli kullanıyorum sürekli. Public static, __construct, private v.s olması konusunu kavrayamadım sizde dışarıdan erişime kapatmak icin v.s notlar dusmusunuz yaziniza. Benim kullandığım model başımı nasıl belaya sokabilir. XSS açığı bırakmadığım sürece sorun olurşturmaz gibi geliyor bana yorumunuzu yazarsanız sevinirim iyi çalışmalar …

class mehmet {
public static $output = ”;
public static $nelazimsa = ”;

public static function query_filter($o){
#islemler ….
}
}

2 | Emre Çevik

25 / 06 / 2009 - 20:28

Avatar

şimdi şöyleki bazı tasarım şablonları var bunlardan biriside bu konuda anlattığım singleton. bunun kullanılma sebebi bir kere oluşturulup bir daha oluşturulması gerekmeyen yapılarda. constructor’u private yaparta tekrar olusturulmasını engelliyoruz.

bu bize ne kazandırıyor daha çok performans. örneği incelerseniz sınıfı tekrar olusturmaya calışmıyor elinde sınıf varsa bize o sınıfı tekrar veriyor. mesela veritabanı sınıflarını sadece bir kere oluşturmak yeterlidir. constuctorında veritabanına baglanır ve baglantıyı kesmediğiniz sürece onu kullanabilirsiniz.

ama her sınıf bu yapıda olacak diye bişey yok bazı sınıflar vardırki yeniden oluşturulmaz constructor’ın çalışması gerekir. yani güvenlik açısından değilde benim bu yazdıkların daha çok performans ve kullanım açısından, güvenlik tamamen ayrı bir konu.

3 | Emre Çevik

25 / 06 / 2009 - 22:59

Avatar

design pattern olayını bitince, public private ve protected ile ilgilide bir yazı yazarım. internette bunlarla ilgili bilgiler bulabilirsiniz aslında kullanımı ve mantığı basit fakat ben internetteki makaleleri okuyunca kullandıkları jargon yüzünden çok zorlanıyorum ve kendi yazdığım yazılarda herkesin anlayabilmesi için en basit şekline indirgemeye çalışıyorum.

4 | Omer

26 / 06 / 2009 - 09:14

Avatar

cevap için teşekkürler. Internette ne bulduysam okudum ama sanırım boşluktan dolayı kavrayamadım.

5 | Emre Çevik

26 / 06 / 2009 - 09:43

Avatar

genelde php ile ilgili makaleleri okuyorsanız biraz normal. fazla makale bulmanız zor. yakında bu konuyla ilgili bir yazı yazacağım. ben genelde asp.net makalelerini okuyorum bu konularda. csharpnedir.com var mesela guzel makaleler var. biraz asp.net bilgim oldugu icin ve bunları php ye yorumlayabildiğim için bana çok faydası oluyor. bu arada bloğunuzda delizade diye bir blog gordum sahibi benim asker arkadaşım tanışıyor musunuz siz?

6 | Omer

26 / 06 / 2009 - 10:21

Avatar

Valla güzel olur bi makale.

Yok tanışmıyoruz da tanışılması gereken bi insan blogunda ki kısıtlı olan yazılarını okuduktan hoşuma gidip bağlantı verdim sadece…

7 | Emre Çevik

26 / 06 / 2009 - 10:40

Avatar

anladım bayadırda bloguna yazmıyomuş bişeyler. askerden yeni geldi zaten 1 ay felan oldu. şans işte adamı tanımıyosun bloguna yazmışsın oda benim askerden arkadaşım şaka gibi :)

8 | Gökçe YALÇIN

20 / 08 / 2009 - 16:40

Avatar

Öncelikle güzel bir anlatım olmuş. Teşekkürler.

Design patternlarla haşır neşir biri olarak, birkaç şey kafama takıldı;

1) OO ‘da sınıf içinde die(); çıkışı biraz sert kaçıyor, throw new Exception(”Bu sınıf singleton, clone()’lanamaz”); desek, daha hoş olmaz mı?

2) Instanceları array olarak tutmak ve çağırmak bu patternin biraz dışına çıkmıyor mu? Benim bildiğim, context değiştirilmesini engellemek amacıyla bir sınıfın singleton versiyonları tutulmaz, onu singleton yapmanın amacının biraz dışına itiyor. Eğer sınıfta contexti değiştirecek bir şey varsa, onu singleton yapmaktansa registery->add(’A',$object), $registery::get(’A') gibi bir başka singleton sınıfla kullanmak daha kapsamlı bir yaklaşım değil mi?

9 | Emre Çevik

24 / 08 / 2009 - 09:46

Avatar

1. maddeye gelince kesinlikle katılıyorum. zaten hiç bir zaman die kullanmam ama amaç singletonu anlatmak olduğu için öyle geçildi.

2. konuya gelince singletonun dışına niye çıkmış olsun ki sizinde blogoğunuzda bir yazınız var orada siz array olarak tutmuyor musunuz ?

http://www.gokceyalcin.com/singleton-uyarlanabilir-design-pattern-class-sinif

ayrıca design patternler sizinde bildiğiniz gibi bir soruna çözüm getirmesi ile kullanılan yapılardır yani çok katı kurallarınının olduğunu dusunmuyorum açıkçası sizde bir sorun bulup kendi patterninizi yazabilirsiniz sonuçta.

yorum yaz

ne yapıyoruz

eğleniyoruz?

anket

design pattern yazılarını nasıl buldunuz?

sonuçlar

Loading ... Loading ...