Bir otomotiv fabrikasının yazılımı yazdığınızı düşünelim. Bu fabrikada Audi ve Bmw markalarına ait arabalar üretiliyor. Teknik olarak düşündüğümüzde her arabanın bir markası, modeli, fiyatı, motor gücü vb.gibi özellikleri vardır. Biz yazılımcı olarak bu her model için bir sınıf oluşturmaya başladıkça satır sayıları kontrolsüz bir şekilde artacak ve satır satır belki yeniden kod yazmak zorunda kalacağız. Bu gibi alt sınıfları çok olan sınıfların üretiminde Factory Design Pattern(Fabrika Tasarım Şablonu) kullanılmaktadır.

Yukarıda UML şablonunu incelediğimizde ArabaFactory’e ait BmwFactory ve NissanFactory sınıfları oluşturulmaktadır. Bu sınıflar ile aracılığı ile Audi ve Nissan’ın arabaları ürütilecektir. Bu alt modeller ise en başta konuştuğumuz gibi araçların belirli bir strandartları olduğu için Araba sınıfını kalıtım olarak almaktadır. Şimdi kodlamamıza geçelim.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
package Factory_Design_Pattern_4; public class Araba { private String marka; private String model; private double fiyat; public Araba(String marka, String model, double fiyat){ this.marka=marka; this.model=model; this.fiyat=fiyat; } public String getMarka() { return marka; } public void setMarka(String marka) { this.marka = marka; } public String getModel() { return model; } public void setModel(String model) { this.model = model; } public double getFiyat() { return fiyat; } public void setFiyat(double fiyat) { this.fiyat = fiyat; } } |
Yukarıda ilk olarak Araba sınıfımızı oluşturarak içinde yer alacak bazı özellikleri ve metotları belirledik.
|
1 2 3 4 5 6 7 8 9 |
package Factory_Design_Pattern_4; public class BmwZ4 extends Araba { public BmwZ4(double fiyat) { super("BMW", "Z4", fiyat); } } |
Yukarıda ki sınıfta ise Araba sınıfı BmwZ4 sınıfını türetti ve yapıcı metodunda sadece fiyat parametresini aldı.
|
1 2 3 4 5 6 7 8 9 |
package Factory_Design_Pattern_4; public class Nissan350z extends Araba { public Nissan350z( double fiyat) { super("Nissan", "350z", fiyat); } } |
BmwZ4 için yapılan işlemlerin aynısını Nissan350z sınıfı içinde yapıldı.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
package Factory_Design_Pattern_4; import java.util.ArrayList; import java.util.List; public abstract class ArabaFactory { public List<Araba> arabaListesi=new ArrayList<Araba>(); public ArabaFactory(){ createAraba(); } public abstract void createAraba(); public List<Araba> getArabaListesi() { return arabaListesi; } public void setArabaListesi(List<Araba> arabaListesi) { this.arabaListesi = arabaListesi; } } |
ArabaFactory sınıfımızı abstract class olarak belirledik. Böylece bu sınıfı kalıtım olarak alan diğer sınıflar bu sınıfın hazır metotlarını kullanma ve createAraba metotunu kendilerine uyarlayarak yazma imkanına kavuşacaklar. arabaListesi değişkeni ile üretilen arabaların listesini tutmayı sağladık. Sınıfın yapıcı metotunda createAraba() fonksiyonunu kullanıdk ki bu sınıfa ait veya alt sınıfına ait bir nesne üretildiğinde otomatik olarak creteAraba() metotu devreye girsin.
|
1 2 3 4 5 6 7 8 9 10 |
package Factory_Design_Pattern_4; public class BmwFactory extends ArabaFactory { @Override public void createAraba() { getArabaListesi().add(new BmwZ4(120000)); } } |
BmwFactory sınıfı ArabaFactory sınıfını kalıtım olarak alarak createArabasa metodunu ezerek kendisine uygun biçimde kodları yazdı. Burada dikkat edin createAraba metodu içersinde araba listesine BmwZ4 sınıfı üretilerek listeye eklendi. Yeni modeller oluştuğunda bu listeye eklememiz yeterli olacak.
|
1 2 3 4 5 6 7 8 9 10 11 |
package Factory_Design_Pattern_4; public class NissanFactory extends ArabaFactory { @Override public void createAraba() { getArabaListesi().add(new Nissan350z(140000)); } } |
BmwFactory için geçerli olan kodlar NissanFactory içinde geçerli. Burada da Nissan350z sınıfı listeye eklendi.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package Factory_Design_Pattern_4; public class Test { public static void main(String[] args) { ArabaFactory bmwArabalar=new BmwFactory(); ArabaFactory nissanArabalar=new NissanFactory(); for(Araba araba: bmwArabalar.getArabaListesi()){ System.out.println(araba.getMarka() + " - " + araba.getModel() + " - " + araba.getFiyat()); } for(Araba araba: nissanArabalar.getArabaListesi()){ System.out.println(araba.getMarka() + " - " + araba.getModel() + " - " + araba.getFiyat()); } } } |
ArabaFactory sınıfı alt sınıfları olan BmwFactory ve NissanFactory alt sınıflarının nesnesi üretildi. Üretilen bu nesneler ile daha önce fabrikalarında üretilmesi için tanımlanmış olan araba modelleri for ile tek tek ekrana aşağıda ki gibi yazdırıldı.
![]()





