Burak IŞIKLI

Computer scientist living in Istanbul, Turkey. Data scientist at Turkcell, Traveller, Rower, Sailor

Twitter Github Linkedin Mail

Design Patterns(Tasarım Şablonları)-1

şablonları aşağıda yeralan ortak özelliklere sahiptir:

  • Edinilen tecrübeler sonunda ortaya çıkmışlardır.
  • Tekerin tekrar icat edilmesini önlerler.
  • Tekrar kullanılabilir kalıplardır.
  • Ortak kullanılarak daha büyük problemlerin çözülmesinım şablonları ve kullanım alanları hakkında ihtisas yapmış olmak gerekmektedir. Tasarım şablonları değişik kategorilere ayrılır. Bunlar: - Oluşturucu tasarım şablonları (**creational patterns**) - Yapısal tasarım şablonları (**structual patterns**) - Davranışsal tasarım şablonlar (**behavioral patterns**) +—————————————+—————————————+—————————————+ | Oluşturucu | Yapısal | Davranışsal | +—————————————+—————————————+—————————————+ | - Abstract Factory | - Adapter | - Command (komut) | | (soyut fabrika) |

    |

    | |

    | - Bridge (köprü) | - Memento (hatıra) | | - Builder (inşaatçi) | | | | | - Facade (cephe) | - Strategy (strateji) | | - Factory Method | | | | (fabrika) | - Decorator (dekotatör) | - Iterator | | | | (tekrarlayıcı) | | - Prototype  (prototip) | - Composite (kompozit) | | | | | - State (durum) | |

    | - Flyweight (sinek | | | - Singleton (yalnızlık) | siklet) | - Chain Of | | | | Responsibility | | | - Proxy (vekil) | (sorumluluk zinciri) | | | | | | |

    | - Mediator (aracı) | | | | | | | | - Observer (gözlemci) | | | | | | | | - Template Method | | | | (şablon metot) | | | | | | | |

    | | | | - Visitor (ziyaretçi) | +—————————————+—————————————+—————————————+ **1-) SINGLETON PATTERN(YALNIZLIK TASARIM ŞABLONU)** Bazı durumlarda bir sınıftan sadece bir nesnenin oluşturulması ve oluşturulan bu nesnenin tüm sistemde kullanılması gerekebilir. Örneğin bilgibankası için bir connection pool (bilgibankası bağlantı havuzu) sadece bir defa oluşturulmalı ve kullanılmalıdır veya oluşturulacak properties nesnesinin bir kere ve proses(process) çalışmaya başladığı anda(constructor) oluşturulmalıdır. Bu durumda Singleton tasarım şablonu kullanılarak, bir sınıftan sadece bir nesnenin oluşturulması sağlanabilir. ![Singleton Pattern UML Diagram](http://burakisikli.files.wordpress.com/2009/06/singletonuml.gif “Singleton Pattern UML Diagram”) Singleton tasarım şablonunu iki farklı yöntemle yapabiliriz. Yapacağımız değişiklik senkronizasyonu yapacağımız aracı değiştirmektir. Senkronizasyonu kilit objesiyle veya komple sınıfı kilitleyerek yapabiliriz. Bir singleton sınıfın taşıması gereken bazı özellikler vardır. Bunlar: ·Sınıf konstruktörlerinin(constructor) private olması gerekiyor. Konstruktörleri private olan bir sınıftan, başka bir sınıf new operatörü ile nesne oluşturamaz. ·Singleton sınıfından sadece bir tane nesne oluşturulması gerektiği için, oluşturulması gereken nesneyi sınıfın static değişkeni olarak tanımlamamız gerekiyor. Örnekte “private static Singleton instance = null” şeklinde bu tanımlamayı yapıyoruz. ·Singleton sınıfında instance() isminde static bir metodun olması ve bu metodun static olarak tanımlanmış nesneyi geri vermesi gerekiyor. instance() metodu içinde sınıfın tek nesnesi olacak değişken oluşturulur. **Singleton.java** ::java package edu.burakkk.patterns.singleton; /** * Singleton Pattern(Yalnızlık Tasarım Şablonu) * Yaratılacak objelerin bir sefer yaratılıp * aynı objenin birden fazla yerde yeniden * yaratılmadan kullanılmasını sağlar * Singleton Sınıfı * *@version 1.0 Release 1 *@author Burak ISIKLI *@date June 18, 2009 * **/ public class Singleton { /* * Singleton sinifindan olusturulabilecek tek nesne static sinif degiskeni * olarak tanimlaniyor. */ private static volatile Singleton instance = null; /* * Sınıf yerine kullanılacak obje tanımı(synchronized(lock)) Double check * locking yapabilmek icin kullanilan nesne. private static Object lock = * new Object(); * * * * Baska siniflarin new Singleton() seklinde nesne olusturmalarini, sinif * konstruktorünü private yaparak engellemis oluyoruz. */ private Singleton() { System.out.println(“Constructor”); } /** * Singleton sinifindan olusturulabilen tek nesneye ulasmak icin instance() * metodu kullanilir. * * @return Singleton static Singleton nesnesi */ public static Singleton getInstance() { if (instance == null) { // Double checked locking synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } /** * Singleton sinifinda bulunan bir metod. Buraya kendi metotlarınızı * ekleyebilirsiniz */ public void printIt() { System.out.println(this); } } **Main.java** ::java package edu.burakkk.patterns.singleton; /** * Singleton Pattern(Yalnızlık Tasarım Şablonu) * Yaratılacak objelerin bir sefer yaratılıp * aynı objenin birden fazla yerde yeniden * yaratılmadan kullanılmasını sağlar * Main Sınıfı * *@version 1.0 Release 1 *@author Burak ISIKLI *@date June 18, 2009 * **/ public class Main { public static void main(String[] args) { Singleton.getInstance().printIt(); } } Main sınıfımızı çalıştırdığımızda ekrana şunlar gelecektir: Constructor edu.burakkk.patterns.singleton.Singleton@9304b1 Yukarıda yazdığımız kod ise multithread’e karşı güvenli bir koddur. Yine de bunu test etmek için de bir sınıf oluşturalım: **Test.java** ::java package edu.burakkk.patterns.singleton; /** * Singleton Pattern(Yalnızlık Tasarım Şablonu) * Yaratılacak objelerin bir sefer yaratılıp * aynı objenin birden fazla yerde yeniden * yaratılmadan kullanılmasını sağlar * MultiThread Test Sınıfı * *@version 1.0 Release 1 *@author Burak ISIKLI *@date June 18, 2009 * **/ public class Test { private static Singleton singletona, singletonb; public static void main(String[] args) { // getInstance() iki ayrı thread ile çağırılsın. Thread threada = new Thread() { @Override public void run() { singletona = Singleton.getInstance(); } }; threada.start(); Thread threadb = new Thread() { @Override public void run() { singletonb = Singleton.getInstance(); } }; threadb.start(); // Her iki thread tamamlanana kadar beklensin while (!(threada.getState() == Thread.State.TERMINATED && threadb .getState() == Thread.State.TERMINATED)) ; System.out.println(singletona == singletonb); } } Eğer test başarılı olursa ekran çıktısı şu şekilde olacaktır: Constructor true *Notlar:* Abstract Factory, Builder ve Prototype tasarım şablonlarında olabileceği gibi birçok tasarım şablonu Singleton tasarım şablonu kullanılarak implemente edilir. [](http://en.wikipedia.org/wiki/Facade_pattern “Facade pattern”) [Facade](http://en.wikipedia.org/wiki/Facade_pattern “Facade pattern”) objeleri genellik Singleton’dır çünkü sadece bir tane Facade objesi gereklidir. State(Durum) objeleri genellikle Singleton’dır. Daha detaylı bilgi için:

    package edu.burakkk.patterns.singleton;

    /\*\* \* Singleton Pattern(Yalnızlık Tasarım Şablonu) \* Yaratılacak objelerin bir sefer yaratılıp \* aynı objenin birden fazla yerde yeniden \* yaratılmadan kullanılmasını sağlar \* MultiThread Test Sınıfı \* \*@version 1.0 Release 1 \*@author Burak ISIKLI \*@date June 18, 2009 \* \*\*/ public class Test { private static Singleton singletona, singletonb; public static void main(String\[\] args) { // getInstance() iki ayrı thread ile çağırılsın. Thread threada = new Thread() { @Override public void run() { singletona = Singleton.getInstance(); } }; threada.start(); Thread threadb = new Thread() { @Override public void run() { singletonb = Singleton.getInstance(); } }; threadb.start(); // Her iki thread tamamlanana kadar beklensin while (!(threada.getState() == Thread.State.TERMINATED && threadb .getState() == Thread.State.TERMINATED)) ; System.out.println(singletona == singletonb); } }

Comments !