Tasarım Desenleri
Nesneye Dayalı Programlamada Sınıf İlişkileri Nasıl Olmalı?
Testçiler sizin düşmanınız değildir. Esas düşman yazılım hatalarıdır!
Yaratıcı Tasarım Desenleri

Fabrika Yordam ( Factory Method ) Tasarım Deseni

Fabrika yordam tasarım deseni, nesne yaratma sorumluluğunun bir yordama verilmesidir. Yaratılan nesne, bir sınıf hiyerarşisindeki alt sınıflardan biridir. Hangi alt sınıfın yaratılacağı kararı fabrika yordam içinde verilir. Bu yordam ile belirli bir sınıf hiyerarşisindeki alt nesnelerden birinin yaratma sorumluluğu belirli bir arayüze verilerek sistemden soyutlanmış olur. Böylece nesneleri yaratma kodlarında, kod tekrarları önlenmiş olur. Sistem içinde sınıfların yaratılacağı yer tek olduğu için, ilgili mantıklar tek bir yerde toplanabilir.

Örnek Uygulama

Örnek uygulamamız bir resim işleyici programıdır. Bu programdaki resimler oluşturulurken, resimlerin hangi "resim formatında" olacağının da belirlenmesi gerekmektedir. Uygulama üzerinde "gif" ve "jpeg" olmak üzere iki tip resim formatı bulunmaktadır. Resimleri oluşturan JpegResimFormatı ve GifResimFormatı sınıflarıdır. Bu sınıflar IResimFormatı isimli bir arayüz sınıfından türemektedirler. Bu sınıfların resmiOluştur isminde soyut bir yordamları bulunur. Resimİşleyici istemci sınıfının IResimFormatı tipinde bir sınıfa ihtiyacı vardır. Bu istemci sınıf bu tipten bir sınıfı alır ve resmiOluştur yordamını çalıştırır. Fakat Resimİşleyici istemci sınıfı IResimFormatı sınıfının yaratılma sorumluluğu üstlenmek istememektedir. İşte burada devreye Fabrika Yordam tasarım deseni girer. IResimFormatı tipindeki nesnenin yaratılma sorumluluğu FormatSeçici sınıfının formatAl isimli yordamına verilmiştir. Bu yordam Fabrika Yordamdır. Bu sınıfın "FormatSeçici" gibi ayrı sınıfta olması gerekmemektedir. Bu örnekte bu yordam örneğin "Resimİşleyici" istemci sınıfında da bulunabilirdi. Fakat daha da esnek olsun diye bunu ayrı sınıfa aldım.

"Fabrika Yordam" tasarım desenindeki istenen sınıfı yaratan yordamın tek görevi sınıfı yaratıp bunu istemciye dönmek olmayabilir. Nesne yaratılırken ilgili mantık kodları da bu sınıfta toplanabilir. Böylece sınıf yaratılma ile ilgili tüm sorumluluklar bu yordamda toplanmış olur. Örneği incelediğimizde fabrika yordam olan formatAl yordamı oluşturulacak resmin "uzunluk" ve "genişlik" değiştirgelerini de almaktadır. Fabrika yordam üzerinde şöyle bir mantık oluşturulmuştur: Üretilecek olan resmin alanı 100 birimden büyükse "jpeg", değilse "gif" formatında olsun. Nesne yaratma ile ilgili bu mantığın da fabrika yordamda bulunduğuna dikkat edin.

/**
*
@author İlker KONAR, Yazılım Kıdemli Uzmanı.
*
* Tasarım Desenleri Sitesi Kodları. Dikkat: Her hakkı saklıdır.
*/



package com.ilkerkonar.uygulamalar.web.designPatterns.sample.factoryMethod;

/**
*
@author İlker KONAR, Kıdemli Yazılım Uzmanı
*
* Tarih Bilgisi: 09 Oca 2013
*
*/
public interface IResimFormatı {

  
void resmiOluştur( Integer uzunluk, Integer genişlik );
}
/**
*
@author İlker KONAR, Yazılım Kıdemli Uzmanı.
*
* Tasarım Desenleri Sitesi Kodları. Dikkat: Her hakkı saklıdır.
*/

package com.ilkerkonar.uygulamalar.web.designPatterns.sample.factoryMethod;

/**
*
@author İlker KONAR, Kıdemli Yazılım Uzmanı
*
* Tarih Bilgisi: 09 Oca 2013
*
*/
public class JpegResimFormatı implements IResimFormatı {

  
/* (non-Javadoc)
    * @see com.ilkerkonar.uygulamalar.web.designPatterns.sample.factoryMethod.IResimFormatı#resmiOluştur
    * (java.lang.Integer, java.lang.Integer)
    */
  
@Override
  
public void resmiOluştur( final Integer uzunluk, final Integer genişlik ) {
     
System.out.println( "Resim Oluştu. Format : JPEG" );
      System.out.println
( "Uzunluk : " + uzunluk + ", Genişlik : " + genişlik );
  
}
}
/**
*
@author İlker KONAR, Yazılım Kıdemli Uzmanı.
*
* Tasarım Desenleri Sitesi Kodları. Dikkat: Her hakkı saklıdır.
*/

package com.ilkerkonar.uygulamalar.web.designPatterns.sample.factoryMethod;

/**
*
@author İlker KONAR, Kıdemli Yazılım Uzmanı
*
* Tarih Bilgisi: 09 Oca 2013
*
*/
public class GifResimFormatı implements IResimFormatı {

  
/* (non-Javadoc)
    * @see com.ilkerkonar.uygulamalar.web.designPatterns.sample.factoryMethod.IResimFormatı#resmiOluştur
    * (java.lang.Integer, java.lang.Integer)
    */
  
@Override
  
public void resmiOluştur( final Integer uzunluk, final Integer genişlik ) {
     
System.out.println( uzunluk + " uzunluğunda, " + genişlik + " genişliğinde GIF formatında resim oluştu." );
  
}
}
/**
*
@author İlker KONAR, Yazılım Kıdemli Uzmanı.
*
* Tasarım Desenleri Sitesi Kodları. Dikkat: Her hakkı saklıdır.
*/



package com.ilkerkonar.uygulamalar.web.designPatterns.sample.factoryMethod;

/**
*
@author İlker KONAR, Kıdemli Yazılım Uzmanı
*
* Tarih Bilgisi: 09 Oca 2013
*
*/
public class FormatSeçici {

  
/**
    * Fabrika Yordamı.
    *
    * Resim alanı 100 birimden büyük resimler için JPEG,
    * daha küçükler için GIF formatı tercih edilir.
    *
    *
@param uzunluk Resim uzunluğu
    *
@param genişlik Resim genişliği
    *
@return ResimFormatı nesnelerinden biri.
    */
  
public IResimFormatı formatAl( final Integer uzunluk, final Integer genişlik ) {

     
final Integer resimAlanı = uzunluk * genişlik;

     
if ( resimAlanı > 100 ) {
        
return new JpegResimFormatı();
     
} else {
        
return new GifResimFormatı();
     
}
   }
}
/**
*
@author İlker KONAR, Yazılım Kıdemli Uzmanı.
*
* Tasarım Desenleri Sitesi Kodları. Dikkat: Her hakkı saklıdır.
*/

package com.ilkerkonar.uygulamalar.web.designPatterns.sample.factoryMethod;

/**
*
@author İlker KONAR, Kıdemli Yazılım Uzmanı
*
* Tarih Bilgisi: 09 Oca 2013
*
*/
public class Resimİşleyici {

  
/**
    *
@param args
    */
  
public static void main( final String[] args ) {

     
// Resim boyutları
     
final Integer uzunluk = 20;
     
final Integer genişlik = 8;

     
// Fabrika yordamını içeren sınıf oluşturuldu.
     
final FormatSeçici formatSeçici = new FormatSeçici();

     
// Fabrika yordamından resim boyutlarına göre bir format nesnesi yaratılıp, döndü.
     
final IResimFormatı resimFormatıNesnesi = formatSeçici.formatAl( uzunluk, genişlik );

     
// Formata göre resim çizildi.
     
resimFormatıNesnesi.resmiOluştur( uzunluk, genişlik );
  
}
}
Resim Oluştu. Format : JPEG
Uzunluk : 20, Genişlik : 8

Yorumlar

Henüz bu sayfa için bir yorum yapılmamıştır.

Yorum Yaz, Düşüncelerini Paylaş

Not: Zorunlu alanlar yıldız (*) ile belirtilmiştir.

Kişisel Bilgiler

E-posta adresiniz kimse ile paylaşılmayacaktır. Gerekli olduğunda sizinle iletişim sağlamak için kullanılacaktır.

Yorum Alanı
Giriş Kontrol


Tüm java kodları "jdk1.7.0_09" ile derlenmiş ve çalıştırılmıştır.

Tüm hakları saklıdır. ©  "İlker KONAR" | İletişim: bilgi@tasarimdesenleri.com