Soyut Fabrika

Bu desen benzer özelliklerdeki fabrika nesnelerini gruplandırarak bir arayüz altında toplar. Fabrika nesneleri kendi niteliklerine göre somut nesneyi yaratırlar. İstemci sınıf, fabrika nesnesinin nasıl bir somut nesne döndüreceğiyle ilgilenmez. Bu desen fabrika yordamı deseniyle benzerlik gösterir. Burada da fabrika yordamları bulunur. Fakat bu desen birden fazla fabrika sınıfı bulundurur. İstemci, ilk önce hangi fabrika sınıfını yaratacağını seçer. Ardından, seçtiği fabrika sınıfından somut nesneyi alır. Yine bu desen sistemden nesne yaratma görevini soyutlamak üzere kullanılır. Sistemde birden fazla ürün ailesi varsa, herbiri için ayrı bir fabrika sınıfı yapılabilir. Her fabrika da kendi ürün ailesinden uygun olan somut nesneyi döndürür.

Örnek :

Bir giysi dükkanı sisteminde çeşitli ayakkabı ve başlıklar satılmaktadır. Fakat ayakkabı ve başlıklar da kendi aralarında yazlık ve kışlık olmak üzere ikiye ayrılmaktadır. Bu sistem ürün yaratma işini kendi üzerinden soyutlamak istemektedir. Ürünler yaratılmak istenmekte ve bu ürünler de, yazlık ve kışlık ile iki ayrı ailede toplanmaktadır. Böyle bir duruma soyut fabrika tasarım deseni çok iyi uymaktadır. Aşağıdaki örnekte, Bere ve Şapka sınıfları Başlık arayüzü altına, Bot ve Terlik sınıfları da Ayakkabı arayüzü altına toplanmıştır. YazlıkGiysiFabrikası sınıfı, Şapka ile Terlik sınıflarını, KışlıkGiysiFabrikası sınıfı ise Bere ile Bot sınıflarını yaratmaktadır. Bu fabrika sınıfları da GiysiFabrikası isimli arayüz altında toplanmıştır. Fabrika isimli fabrika üretici sınıf ise gelen değiştirgeye göre uygun bir giysi fabrikası nesnesini döndürmektedir. GiysiDükkanı sınıfı yani, istemci sınıf bu sistemi kullanarak kendine uygun ürünleri yarattırmaktadır.

Örnek Sınıf Çizelgesi :

Örnek Java Kodu : ( Kodlar java 1.6.0.7 ile derlenip, çalıştırılmıştır. )

Ayakkabı.java :

public interface Ayakkabı {

void giy();

}

Terlik.java :

public class Terlik implements Ayakkabı {


@Override

public void giy() {

// Terlik giyme işlemi.

System.out.println( "Terlik giyildi." );

}

}

Bot.java :

public class Bot implements Ayakkabı {


@Override

public void giy() {

// Bot giyme işlemi.

System.out.println( "Bot giyildi." );

}

}

Başlık.java :

public interface Başlık {

void tak();

}

Şapka.java :

public class Şapka implements Başlık {


@Override

public void tak() {

// Şapka takma işlemi.

System.out.println( "Şapka takıldı." );

}

}

Bere.java :

public class Bere implements Başlık {


@Override

public void tak() {

// Bere takma işlemi.

System.out.println( "Bere takıldı." );

}

}

GiysiFabrikası.java :

public interface GiysiFabrikası {

Başlık başlıkYarat();

Ayakkabı ayakkabıYarat();

}

YazlıkGiysiFabrikası.java :

public class YazlıkGiysiFabrikası implements GiysiFabrikası {


@Override

public Ayakkabı ayakkabıYarat() {

return new Terlik();

}


@Override

public Başlık başlıkYarat() {

return new Şapka();

}

}

KışlıkGiysiFabrikası.java :

public class KışlıkGiysiFabrikası implements GiysiFabrikası {


@Override

public Ayakkabı ayakkabıYarat() {

return new Bot();

}


@Override

public Başlık başlıkYarat() {

return new Bere();

}

}

Fabrika.java :

public class Fabrika {


public GiysiFabrikası fabrikaAl( String tip ) {

if ( tip.equals( "yazlık" ) ) {

return new YazlıkGiysiFabrikası();

} else if ( tip.equals( "kışlık" ) ) {

return new KışlıkGiysiFabrikası();

}

// Varsayılan giysi fabrika tipi.

return new KışlıkGiysiFabrikası();

}

}

GiysiDükkanı.java :

public class GiysiDükkanı {

public static void main(String[] args) {

GiysiFabrikası fabrika = new Fabrika().fabrikaAl( "yazlık" );

Ayakkabı ayakkabı = fabrika.ayakkabıYarat();

Başlık başlık = fabrika.başlıkYarat();

ayakkabı.giy();

başlık.tak();

}

}