Burak IŞIKLI :))

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

Posted in Java by Burak IŞIKLI on 18 Haziran 2009

Yazılım esnasında tekrar eden sorunları çözmek için kullanılan ve tekrar kullanilabilir tipte kod yazılımını destekleyen bir ya da birden fazla sınıftan oluşmuş modül ve program parçalarına Tasarım Şablonu denir. Tasarım şablonları, programcılar tarafından edindikleri tecrübeler doğrultusunda oluşmuş kalıplardır. Bu kalıplar sorunu tanımlıyarak, çözümü için gerekli atılması gereken adımlari ihtiva ederler. Kullanıcı kalıbı, tanımlanmış sorunu çözmek için tekrar tekeri icat etmek zorunda kalmadan kullanabilir.

Tasarım ş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ülmesine katkı sağlarlar.
  • Devamlı geliştirilerek, genel bir çözüm olmaları için çaba sarfedilir.

Program bakımı ve geliştirilmesi için ilk yazılım sürecinden daha çok enerji sarfedilir. Bu yüzden yazılım esnasında esnek bir yapının ve mimarinin oluşturulmasına dikkat edilmesi gerekmektedir. Esnek mimariler için değişik türde tasarım şablonları kullanılabilir. En basit ve uygulaması kolay bir tasarım şablonunun kullanılması, hiçbir tasarım şablonunun kullanılmamasından daha iyidir. İyi bir yazılım mühendisi olabilmek için tasarı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 (soyut fabrika)

– Builder (inşaatçi)

– Factory Method (fabrika)

– Prototype  (prototip)

– Singleton (yalnızlık)

– Adapter

– Bridge (köprü)

– Facade (cephe)

– Decorator (dekotatör)

– Composite (kompozit)

– Flyweight (sinek siklet)

– Proxy (vekil)

– Command (komut)

– Memento (hatıra)

– Strategy (strateji)

– Iterator (tekrarlayıcı)

– State (durum)

– Chain Of Responsibility (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

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


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


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


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.

Facade objeleri genellik Singleton’dır çünkü sadece bir tane Facade objesi gereklidir.

State(Durum) objeleri genellikle Singleton’dır.

Daha detaylı bilgi için:

http://www.ibm.com/developerworks/library/j-dcl.html

http://www.kurumsaljava.com

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);
}
}

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Connecting to %s

%d blogcu bunu beğendi: