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

Soyut Fabrika ( Abstract Factory ) Tasarım Deseni

Yaratılma sorumluluklarının çeşitli sınıf hiyerarşileri ile sağlandığı bir tasarım desenidir. İstemci sınıf, çeşitli kategorideki sınıflara ihtiyaç duyar. Bu sınıflar, sistemde alt/üst sınıf hiyerarşileri şeklinde bulunurlar. "Soyut Fabrika" tasarım deseni bu karmaşık ve farklı hiyerarşideki sınıfların yaratılma sorumluluğunu çeşitli fabrika sınıflarına verir. İstemci ilk önce verdiği kriterlere göre uygun bir fabrika sınıfını seçer. Ardından seçtiği fabrika nesnesi, istemcinin ihtiyaç duyduğu sınıfları yaratıp istemciye döner. İstemci sınıf, kullandığı sınıfların sadece üst sınıflarını, yani soyut sınıflarını bilir. Bu sınıfları ona yaratıp döndüren fabrika sınıfının da sadece soyut sınıfını içerir. Alttaki detaylar istemci sınıftan gizlenmiş, sorumluluk "Soyut Fabrika" tasarım deseni ile fabrika sınıflarına verilmiştir. Bu tasarım deseni Fabrika Yordam tasarım desenine benzer. Fakat bu tasarım deseninde yaratılacak birden fazla sınıf hiyerarşisi tipi bulunur. Fakat "fabrika yordam" tasarım deseninde tek tip nesne yaratılması ihtiyacı bulunur.

Kısaca bu tasarım deseni ile birden fazla sınıf hiyerarşisi nesneleri, kurulacak birden fazla fabrika nesneleri ile yaratılır. İstemci kendisine uygun fabrika nesnesini yarattırır. İhtiyacı olan nesnelerin yaratılma sorumluluğunu fabrika nesnelerine bırakır.

Örnek Uygulama

Örnek uygulamamızda "Sipariş Gönderici" bir sistem tasarlıyoruz. Sipariş sisteme verildikten sonra, bir ödeme yöntemi ve siparişin durumu hakkında bilgi vermek için bir de bildirim yöntemi seçilmek zorundadır. Sistemde siparişler hızlı ve normal olarak ikiye ayrılmıştır.

Bildirim yöntemleri ve ödeme yöntemlerinin oluşturulmaları soyut fabrika sınıflarına verilmiştir. Ayrıca sipariş yöntemini oluşturmak da yine bir soyut fabrika sınıfına verilmiştir. Sistemde çalışacak ve farklı kategorilerdeki sınıfları oluşturmak için burada soyut fabrika tasarım deseni kullanılabilir. Siparişin yöntemine göre ( hızlı veya normal ) bildirim ve ödeme yöntemi değişmektedir. Normal gönderimlerde bildirim yöntemi olarak "e-posta", ödeme yöntemi olarak da "posta çeki" kullanılmaktadır. Hızlı sipariş yönteminde ise bildirim yöntemi olarak "sms", ödeme yöntemi olarak da "havale" kullanılmaktadır. Soyut fabrika tasarım desenimiz bu şekilde tasarlanacaktır. Görüldüğü gibi sistemde farklı kategorilerde birden fazla sınıf hiyerarşisinden ihtiyaç duyulan sınıfların yaratılma gereksinimi bulunmaktadır.

Sistem şöyle çalışmaktadır: İlk önce istemci sınıf olan SiparişGönderici sınıfına iki adet değiştirge geçilmektedir. Bu değiştirgelerden birincisi sipariş yöntemini ( "hızlı", "normal" ) seçmektedir. İkinci değiştirge ise sipariş tutarını belirlemektedir. Birinci değiştirge girildikten sonra, bu değiştirgenin değerine göre sipariş yöntemi sınıflarından biri yaratılarak dönülecektir. ( HızlıSiparişNesneFabrikası veya NormalSiparişNesneFabrikası ). Bu iki sınıf da ödeme tipi ve bildirim sınıf hiyerarşilerinden bir tane sınıf yaratarak dönmektedir. HızlıSiparişNesneFabrikası sınıfı ÖdemeTipi sınıfı olarak Havale'yi, Bildirim sınıfı olarak da Sms'i dönmektedir. NormalSiparişNesneFabrikası sınıfı ÖdemeTipi sınıfı olarak PostaÇeki'ni, Bildirim sınıfı olarak da Eposta'yı dönmektedir

Örnek uygulamamızda birinci parametre olarak "hızlı", ikinci parametre olarak da 105 girilmiştir.

/**
*
@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.abstractFactory;

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

  
void mesajGönder( String metin );
}
/**
*
@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.abstractFactory;

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

  
@Override
  
public void mesajGönder( final String metin ) {
     
System.out.println( "E-posta ile '" + metin + "' içeriği gönderilmiştir." );
  
}
}
/**
*
@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.abstractFactory;

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

  
@Override
  
public void mesajGönder( final String metin ) {
     
System.out.println( "Sms ile '" + metin + "' içeriği gönderilmiştir." );
  
}
}
/**
*
@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.abstractFactory;

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

  
void paraGönder( Integer miktar );
}
/**
*
@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.abstractFactory;

/**
*
@author İlker KONAR, Kıdemli Yazılım Uzmanı
*
* Tarih Bilgisi: 28 Oca 2013
*
*/
public class PostaÇeki implements ÖdemeTipi {

  
@Override
  
public void paraGönder( final Integer miktar ) {
     
System.out.println( "Posta çeki ile " + miktar + " TL para gönderilmiştir." );
  
}
}
/**
*
@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.abstractFactory;

/**
*
@author İlker KONAR, Kıdemli Yazılım Uzmanı
*
* Tarih Bilgisi: 28 Oca 2013
*
*/
public class Havale implements ÖdemeTipi {

  
@Override
  
public void paraGönder( final Integer miktar ) {
     
System.out.println( "Havele ile " + miktar + " TL para gönderilmiştir." );
  
}
}
/**
*
@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.abstractFactory;

/**
*
@author İlker KONAR, Kıdemli Yazılım Uzmanı
*
* Tarih Bilgisi: 29 Oca 2013
*
*/
public interface ISiparişNesneFabrikası {

  
ÖdemeTipi ödemeTipiYarat();

   Bildirim bildirimYarat
();
}
/**
*
@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.abstractFactory;

/**
*
@author İlker KONAR, Kıdemli Yazılım Uzmanı
*
* Tarih Bilgisi: 29 Oca 2013
*
*/
public class NormalSiparişNesneFabrikası implements ISiparişNesneFabrikası {

  
@Override
  
public ÖdemeTipi ödemeTipiYarat() {
     
return new PostaÇeki();
  
}

  
@Override
  
public Bildirim bildirimYarat() {
     
return new Eposta();
  
}
}
/**
*
@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.abstractFactory;

/**
*
@author İlker KONAR, Kıdemli Yazılım Uzmanı
*
* Tarih Bilgisi: 29 Oca 2013
*
*/
public class HızlıSiparişNesneFabrikası implements ISiparişNesneFabrikası {

  
@Override
  
public ÖdemeTipi ödemeTipiYarat() {
     
return new Havale();
  
}

  
@Override
  
public Bildirim bildirimYarat() {
     
return new Sms();
  
}
}
/**
*
@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.abstractFactory;

/**
*
@author İlker KONAR, Kıdemli Yazılım Uzmanı
*
* Tarih Bilgisi: 29 Oca 2013
*
*/
public class SiparişGönderici {

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

     
ISiparişNesneFabrikası siparişNesneFabrikası = null;

     
if ( args[ 0 ].equals( "hızlı" ) ) {
        
siparişNesneFabrikası = new HızlıSiparişNesneFabrikası();
     
} else {
        
siparişNesneFabrikası = new NormalSiparişNesneFabrikası();
     
}

     
final ÖdemeTipi ödemeTipi = siparişNesneFabrikası.ödemeTipiYarat();
     
final Bildirim bildirim = siparişNesneFabrikası.bildirimYarat();

      ödemeTipi.paraGönder
( Integer.valueOf( args[ 1 ] ) );
      bildirim.mesajGönder
( "Siparişiniz gönderilmiştir." );
  
}
}
Havele ile 105 TL para gönderilmiştir.
Sms ile 'Siparişiniz gönderilmiştir.' içeriği gönderilmiştir.

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