İçeriğe geç

Abstract Factory Tasarım Kalıbı

Merhaba arkadaşlar,

Bu yazıda “Abstract Factory Design Pattern” den bahsedeceğiz.

Bir önceki yazıda sorunun ne olduğu ile alalaklı ufak bir bilgi vermiştim. Tekrar bir bahsedeyim.

Factory metodunda TelefonFabrikasi adında bir fabrika oluşturmuştuk ve model bilgisine göre, eğer S8 ise “S8 üret”, Note8 ise “Note8 üret” demiştik fakat Samsung’un yüzlerce model telefonu olabileceğini ve bunların tümü için if else yazıldığında kodun oldukça karmaşık bir hale gelebileceğini belirtmiştik.

Bunu çözmek için de Abstact Factory Tasarım Kalıbı doğdu demiştik.

Peki ne yapıyor da çözüyor abstract factory. TelefonFabrikasi sinifini da bölüyor. Yani bizim TelefonFabrikasi sınıfımızı yani fabrikamızı s8Fabrikasi ve note8Fabrikasi diye 2 ye bölüyor.

S8Fabrikasi sadece s8 üretiyor. Note8 fabrikasi ise sadece note8 üretiyor. Bayiler ise s8 istediklerinde s8Fabrikasindan istiyorlar. Note8 istediklerinde ise note8 fabrikasından istiyorlar.

Şimdi bunu nasıl yapacağımıza bakalım. Öncelikle Telefon interface imiz, s8 ve note8 classlarımızda bir değişiklik yapmayacağız. Bunları kopyalayalım.

Kopyaladıktan sonra TelefonFabrikası’nda ne yapmıştık. Gelen modele göre modeli oluşturup dönmüştük. Bu sınıfta yapılan iş de aslında, verilen türe göre bize bir telefon dönmesi.

Peki S8Fabrikası ve Note8Fabrikası ne iş yapacak? Tamamen aynı işi yapacak. Dolayısı ile burada da bir soyutlama yapabiliriz. Tüm telefon fabrikalarının getTelefon(…) metodu olmalıdır diyebiliriz.  TelefonFactory adında bir interface oluşturalım.

İçinde telefon dönen getTelefon() metodu olmalı. Ekleyelim.

public interface TelefonFactory {

    Telefon getTelefon(String model, String batarya, int en, int boy);
}

Şimdi bunu implemente eden S8Fabrikası ve Note8Fabrikası sınıflarını oluşturabiliriz. Önce s8 fabrikası adında bir sınıf oluşturuyorum.

Bu sınıf TelefonFabrikası interface inden implemente olmuştur. Ekleyelim

public class S8Fabrikasi implements TelefonFactory {
    @Override
    public Telefon getTelefon(String model, String batarya, int en, int boy) {
        return new S8(model, batarya, en, boy);
    }
}

Classı kopyalayıp, Note8Fabrikasi sınıfını da oluşturalım.

public class Note8Fabrikasi implements TelefonFactory {
    @Override
    public Telefon getTelefon(String model, String batarya, int en, int boy) {
        return new Note8(model, batarya, en, boy);
    }
}

Şimdi telefon bayisi sınıfını oluşturalım.

public class TelefonBayisi {

    public static void main(String[] args) {
        
    }
}

Şimdi ne demiştik? Bayiler fabrikaları ve interface leri bilecek. Metotlar static olmadığından dolayı, fabrika sınıflarını oluşturmamız gerekiyor. New s8 fabrikası diyerek bir s8 fabrikası oluşturuyorum.

  • Oluşturulır. s8Fab s8Fab = new s8Fab();

Ardından getTelefon diyerek fabrikadan telefon oluşturması istenir.

public class TelefonBayisi {

    public static void main(String[] args) {
        S8Fabrikasi s8Fabrikasi = new S8Fabrikasi();
        Telefon s8 = s8Fabrikasi.getTelefon("s8", "2600mah", 4, 7);

        System.out.println(s8);
    }
}

Aynı işlemi note8 için de yaapalım.

public class TelefonBayisi {

    public static void main(String[] args) {
        S8Fabrikasi s8Fabrikasi = new S8Fabrikasi();
        Telefon s8 = s8Fabrikasi.getTelefon("s8", "2600mah", 4, 7);

        Note8Fabrikasi note8Fabrikasi = new Note8Fabrikasi();
        Telefon note8 = note8Fabrikasi.getTelefon("Note8", "3000mah", 5, 8);

        System.out.println(s8);
        System.out.println(note8);
    }
}

Çıktı:

S8{model=’s8′, batarya=’2600mah’, en=4, boy=7}
Note8{model=’Note8′, batarya=’3000mah’, en=5, boy=8}

Görüldüğü gibi s8 oluşturulma görevi S8Fabrikasi na, note8 oluşturma görevi de Note8Fabrikasi na bırakıldı. 100 lerce telefon olabildiği durumlarda karmaşık if else lerden kurtulmuş olduk.

Tarih:Featured

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir