Showing posts with label singleton. Show all posts
Showing posts with label singleton. Show all posts

Wednesday, October 3, 2012

Singleton Tasarım Örneği (C#)


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Evler
{
    public class Ev
    {
        /*static elemanlar içerisinde static elemanlar çağrılabileceği için static tanımladık. */
       static Ev instance;


       /* dışardan bir müdahale olmaması için private tanımlanan ev türünden instance değerine belirleyici yazmalıyız.*/
        public static Ev Instance
        {
            get
            {
                /* ev sınıfının nesne örneğini geri döndürmek için; */
                return Ev.instance;
            }
        }

        /* yeni sınıf oluşturulmaması için dışardan ulaşılmamak üzere private tanımlanmalı. */
        private Ev()
        {
         

        }

        public void deneme(double alan2)
        {
            this.Alan=alan2;
        }

      /* static constructorlar parametre almazlar ve private olarak tanımlanırlar. */
      /* ev sınıfından nesne kurulmadan çalıştırılması gerektiği için static tanımladık. diğer türlü sınıfı kurmadan
       constructor çağırmamız mümkün olmayacak ve new anahtar sözcüğünü bir kereyle sınırlandırma şansımız 
       olmayacaktı. */
        static Ev()
        {
            /* instance static olarak tanımlandığı için buradaki static metot tarafından çağrılabiliyor. */
            /* instance değişkeni ile Ev sınıfı kurulduğu anda bellekte bir kereye mahsus olmak üzere new anahtar 
             sözcüğü ile Ev sınıfı için yer oluşturuluyor. daha sonra ev sınıfından üretilen nesneler aynı özellikleri 
             taşıyacaktır. */
            instance = new Ev();
        }

        private static int katno;
        private int odasayisi;
        private double alan;
        private string semt;

        public int Katno
        {
            get
            {
                return katno;
            }

            set
            {
                katno = value;
            }
        }

        public int Odasayisi
        {
            get
            {
                return odasayisi;
            }

            set
            {
                odasayisi = value;
            }
        }

        public double Alan
        {
            get
            {
                return alan;
            }

            set
            {
                alan = value;
            }
        }

        public string Semt
        {
            get
            {
                return semt;
            }

            set
            {
                semt = value;
            }
        }

        public String EvBilgileriniGetir()
        {
            return string.Format(" katno: {0} \n odasayisi: {1} \n alan: {2} \n semt: {3}", katno, odasayisi, alan, semt);
        }

    }


ana program;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Evler;

namespace ConsoleApplication12
{
    class Program
    {
        static void Main(string[] args)
        {
            /* ev ilk kurulduğu anda instance sözcüğü new anahtar sözcüğünü işaret edicek bellekte bir kereliğine
             sınıf için yer açılacak. ardından kurulan her nesne örneği aynı referansı temsil edecektir. */
            Ev ev1 = Ev.Instance;

            ev1.Katno = 3;
            ev1.Odasayisi = 2;
            ev1.Semt = "besiktas";

            Ev ev2 = Ev.Instance();
            ev2.deneme(2);
            ev2.Katno = 11;

            /* ev1 veya ev2 yazmamız bir şeyi değiştirmicektir üzerinde çalıştığımız nesne aynıdır. */
            Console.WriteLine(ev1.EvBilgileriniGetir());

            Console.ReadLine();
        }
    }
}

}

Singleton (Tek) Nesneler (C#)


Singleton (Tek) Nesneler

singleton deseni bir programın yaşam süresince belirli olan bir nesneden sadece bir örneğin(instance) olmasını garantiler.
Aynı zamanda bu desen, yaratılan tek nesneye ilgili sınıfın dışından global düzeyde mutlaka erişilmesini hedefler.

Yeni bir nesne oluşturmak için new anahtar sözcüğünün temsil ettiği yapıcı metoduna dışarıdan erişimin olması gerekir.
Yani yapıcı metodun puplic olarak bildirilmiş olması gerekir. Ancak singleton desenine göre belirli bir anda sadece bir
nesne olabileceği için new anahtar sözcüğünün kullanımının yasaklanması gerekir yani yapıcı metotodun protected ya da private
olarak bildirilmesi gerekir.

Eğer bir metodun varsayılan yapıcı metodu puplic olarak bildirilmemiş ise ilgili sınıf türünden herhangi bir nesnenin sınıfın
dışında tanımlanması mümkün değildir.

Bizim istediğimiz yalnızca bir sınıfın yaratılması olduğuna göre bunu ancak statik üye elemanlar ile yapabiliriz.

1. yöntem:

Puplic class Ev
{

   /*static elemanlar içerisinde static elemanlar çağrılabileceği için static tanımladık. */
   private static Ev ornek;
 
   /* dışardan bir müdahale olmaması için private tanımlanan ev türünden instance değerine belirleyici yazmalıyız.*/
   Puplic Static Ev Ornek
   {
     get
     {
      /* ev sınıfının nesne örneğini geri döndürmek için; */   
       return Ev.ornek;
     }
   }

  /* yeni sınıf oluşturulmaması için dışardan ulaşılmamak üzere private tanımlanmalı. */
  Private Ev()
  {

  }


   /* static constructorlar parametre almazlar ve private olarak tanımlanırlar. */
   /* ev sınıfından nesne kurulmadan çalıştırılması gerektiği için static tanımladık. diğer türlü sınıfı kurmadan constructorı
    * çağırmamız mümkün olmucak ve new anahtar sözcüğünü bir kereyle sınırlandırma şansımız olmucaktı. */
   Static Ev()
  {

       /* instance static olarak tanımlandığı için buradaki static metot tarafından çağrılabiliyor. */
       /* instance değişkeni ile Ev sınıfı kurulduğu anda bellekte bir kereye mahsus olmak üzere new anahtar sözcüğü ile
        * Ev sınıfı için yer oluşturuluyor. daha sonra ev sınıfından üretilen nesneler aynı özellikleri taşıyacaktır. */
     ornek= New Ev();
  }


2.yöntem:

Puplic class Ev
{
  private static Ev ornek;

  Private Ev()
  {
  }

 /* nesne üzerinden erişilmesine gerek kalmadan direkt sınıf ile erişilmesi için statik olmak zorunda */
 
  Puplic static Ev Ornek()
  {
   
      if ( nesne == null)
          nesne = new Ev();
   
     return nesne;
    }

 }
    Gördüğümüz üzere nesne ile ilk olarak sınıf belleğe yüklediğinde değilde o nesneyi ilk defa kullanmak istediğimizde
   yaratılıyor. ilgili nesneyi her istediğimizde yeni bir nesnenin yaratılmaması içinde
   if(nesne == null)
   şeklinde bir koşul yazdığımıza dikkat edin.
 
   sınıf yaratmak için Ev evim = Ev.Ornek();