• en basit "design pattern"lerden (tasarim sablonlarindan) biridir. peki ne zaman kullanilir? niye ihtiyac vardir? bir sinema salonunu düsünün bu salon ayni anda bir gösterim yapabilecektir ve sadece 1 tane olmalidir cünkü gercek hayatta 1 salonluk yerimiz var. bu sinema salonu objesini yaratmak istersek java ile söyle yaratabiliriz.

    sinemasalonu salon = new sinemasalonu();

    elimizde 1 tane salon var. simdi bu salona koltuk ekleyelim.

    salon1.koltukekle("1a");
    salon1.koltukekle("1b");

    simdi elimizde 1 salon ve bu salonda 1a ve 1b adinda iki tane koltuk oldu. bu koltuklar satisa hazir. ama program yapimizin bir yerinde bir baska programci da salon objesi yaratti. ve buna da koltuk ekledi.

    sinemasalonu birsalondaha = new sinemasalonu();
    birsalondaha .koltukekle("1a");
    birsalondaha .koltukekle("1b");

    simdi elimizde yaratilan iki sinema salonu objesi var, ama gercek hayatta 1 salonluk yerimiz var. bilet gisesinde ayni koltugu iki kisiye satmislar diye kavga cikacaktir.

    bunu önlemek icin sinemasalonu() objesinin sadece 1 kere yaratilacagini garanti etmeliyiz. bunu java ile söyle yapabiliriz.

    public class sinemasalonu{
    private static final sinemasalonu ınstance = new sinemasalonu();
    public static sinemasalonu getınstance(){
    return ınstance;
    }
    private sinemasalonu(){

    }
    }

    burada önemli noktalar;
    1. bir tane sinema salonu instance sahibi olmaliyiz, bu private yani disaridan erisilemeyecek olmali, static yani iki ayri kopyasindan olusturulamamali sadece ayni anda 1 tane olmali, ve final yani degistirilemez olmali. bu salon objesinin kendisini tutacak.
    2. disaridan bu sinema salonun kendisinin erisilebilir olmasi icin bir method olmali. bu method kopyasi olmayan, degistirilemeyen sinema salonu objesini dönmeli ki diger methodlar bu salon objesini kullanip koltuk olusturabilisin, rezervasyon yapabilsin.
    3. sinema salonu icin "constructor" mutlaka private olmali. yani bu sinema salonu sinemasalonu salon = new sinemasalonu() ile olusturulamamali, kisaca "new" ile yeni instance olusturulamamali. bunun yerine bu objeyi olsturmanin tek yolu sinemasalonu.getınstance() olacak ve bu method da ayni anda sadece 1 instance olusturacak. isteyene de sadece bu instance verilecek. programin cesitli yerlerinde

    sinemasalonu salon = sinemasalonu.getınstance()

    (dikkat edin sinemasalonu salon = new sinemasalonu() olarak yazmadik)

    yazildiginda salon hep ayni objeyi gösterir, bu salonda bir koltuga rezervasyon yapildiginda programin tümünde nerede bu sinemasalonu() objesi kullanildiysa onlarda da bu koltuk rezervasyonu yapilmis olur cünkü bu obje "singleton" yani ayni anda sadece 1 tane var olabilir.
  • ornek bi singleton class yazmak gerekirse
    class classname
    {
    private classname _this ;
    private classname{
    //private constructor
    }
    public static classname getinstance() {
    if (_this == null)
    _this = new classname();

    return _this;
    }
    }

    kullanimi da soyledir,
    classname cn = classname.getinstance();

    bu durumda o classin sadece bir instance i kol gezer devri alemde
  • bir single malt viski markası.
  • 1) constructor(lar) protected olarak deklare edilir.
    2) yaratildiginda classin single instanceina reference olacak, static bir 'self' pointeri deklare edilir.
    3) 'self' pointeri null iken classin bir instanceini donduren, null degilken de onceden yaratilmi$ instanceini donduren bir static 'getinstance()' functioni olu$turulur.

    afiyet olsun.
  • sanirim ilk olarak gof (gang of four) diye adlandirlan bir dörtlü ekip tarafindan "design patterns" kitabinda yayinlanmistir.
    bir de thread-safe versiyonu vardir:

    pubic class singleton{
    private final static theinstance = new singleton();
    private singleton() {
    }
    public static singleton getinstance() {
    return theinstance;
    }
    }

    yada:

    class singleton{
    private final static theinstance;
    private singleton() {
    }
    public synchronized static singleton getinstance() {
    if (theinstance == null) {
    theinstance = new singleton();
    }
    return theinstance;
    }
    }
  • buradaki görgüsüz kekolara bakmayın. "12 years old luscious nectar" serisi fiyat bandında içilebilecek en iyi iskoç viskidir. hatta verdiğiniz paradan çok daha yüksek bir lezzet ve keyif sunar. yumuşak içimlidir. ilk defa viski içen biri bile kolayca içebilir. bal ve meyve tadı verir alttan. ayrıca da single malttır. bu bakımdan zaten harman viskilerle mukayese edilmez. kaldı ki harman viski fiyatına sunar single malt lezzetini. bunu içen adamın bundan sonraki durağı da talisker'dır. beni dinleyin. pişman olmazsınız.
  • dün 15 yıllığını denediğim viski

    şişesini ve adını beğenmeyip bu zamana kadar denemediğime üzüldüm,tadı harika içinde daha önce hiç denk gelmediğim bal peteği tadı var.içerken şeker fındık karamel tatları geliyor.kokusu tadından da zengin içmeye kıyamadım.
  • * (tasarım kalıbı)ler belirli bir sorunu çözmek için sunulmuş çözümlerdir.
    singleton da bir desing patterndir. hatta bunların en temelidir.

    connection pool gibi yapılardan sadece bir tane olsun isteriz. yani sorunumuz ne? sınıf sadece bir kere oluşsun.

    çözümü düşünelim. bir sınıfı nasıl olacak da oluşturulmasını engelleyeceğim? cevap basit. constructor ını private yapmak.
    fakat böyle de bir sorun var. bu nedir? e, hiç oluşturamadık.

    hmm. o zaman bu classın içinde oluşturalım. iyi fikir gibi sanki. içinde static olarak nesnenin kendisini newleyerek oluştursak da sonra bir public bir metot ile bu nesneyi (mesela getınstance()) dışarı açsak iş çözüldü gibi.

    singleton aslında bu kadar. sonrasında farklı problemler de ortaya çıkmış. ilk değer atamasını ihtiyaç doğduğunda yapalım demiş adamın biri. (bkz: lazy loading)

    yani static tanımladığımız nesneyi globalde newlemeyeceğiz de getınstance() içinde daha önceden newlenmedi ise newleyeceğiz.

    bu da başka problem doğurmuş. o nedir peki? aynı anda 2 istek yapılırsa ne olacak?
    bunun için de demişler ki synchronized kullanın. istekler senkron olsun ki aynı anda gelen istekler sıraya girerek çalışsın.

    boku çıktı biliyorum ama bir sorun daha doğmuş. synchronized performans olarak yavaşmış. demişler ki "bi dakika ya, her seferinde synchronized olmasına ne gerek var. ilk seferde olsa yeter, sonra ben zaten her seferinde eskiyi kullanacağım."

    bunun için de synchronized kullanmadan hemen önce, daha önce nesne oluşmuş mu ona bakmışlar, null kontrolü ile.

    ohh, mis gibi singleton. tele tepe kullan.
  • static class bir bakima bu pattern'in gözle görülebilir bir örneğidir.
  • eğer c# kullanılıyorsa, singleton nesne nin instance ı yaratılırken bir lock object yaratıp onu locklamak faydalı olacaktır.

    public class singleton
    {
    private static object m_lockobject = new object();
    private static singletonobject instance = null;

    public static singletonobject getinstance()
    {
    if(instance == null)
    lock(m_lockobject)
    {
    if(instance == null)
    {
    instance = new singletonobject();
    }
    }
    return instance;
    }
    }
    }
hesabın var mı? giriş yap