iPhone ve LG telefonlar için parça üreten bir fabrikanız olduğunu varsayalım. Bu fabrikada iPhone ve LG için ayrı şarj kablosu ve şarj cihazı üreteceksiniz.
Yukarıda ki UML incelendiğinde merkezi bir Factory interface sınıfının LgFactory ve iPhoneFactory alt interface sınıflarını oluşturduğunu görüyoruz. Sarj_Cihazi abstract sınıfın ise LG_Sarj_Cihazi ve iPhone_Sarj_Cihazi adında alt sınıfları oluşturarak farklı şarj cihazları üretilmesini sağlıyor. Usb_Kablo sınıfıda Lg_Usb_Kablo ve iPhone_Usb_Kablo alt sınıflarını oluşturarak farklı usb kabloların oluşturulmasını sağlıyor. Bunların hepsini ise kullanıcı hangi altsınıfların kullanılması gerektiğini bilmeden yapılmasını Abstract Factory Design Pattern dediğimiz bu yapı sağlıyor. Factory interface sınıfının alt sınıfları LG ve iPhone markalarına özel usb kablosu ve şarj cihazlarını kullanıcının bilgisi olmadan üretilmesini sağlayacak.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package Abstract_Factory_Design_Pattern; public abstract class Sarj_Cihazi { private String sarjCihaziModel; public Sarj_Cihazi(String sarjCihaziModel){ this.sarjCihaziModel=sarjCihaziModel; } public String getSarjCihaziModel() { return sarjCihaziModel; } } |
Sarj_Cihazi abstract sınıfını kodladık. Yapıcı metodunda şarj cihazı modeli bilgisini alarak bilgi sahibi olacağız.
|
1 2 3 4 5 6 7 8 9 |
package Abstract_Factory_Design_Pattern; public class Lg_Sarj_Cihazi extends Sarj_Cihazi { public Lg_Sarj_Cihazi() { super("LG Şarj Cihazı"); } } |
|
1 2 3 4 5 6 7 8 |
package Abstract_Factory_Design_Pattern; public class iPhone_Sarj_Cihazi extends Sarj_Cihazi { public iPhone_Sarj_Cihazi() { super("iPhone Şarj Cihazı"); } } |
Yukarıda tanımladığımız Sarj_Cihazi sınıfını iphone ve lg için ürettiğimiz sınıflara miras olarak tanımladık.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package Abstract_Factory_Design_Pattern; public abstract class Usb_Kablo { private String kabloModel; public Usb_Kablo(String kabloMadel){ this.kabloModel=kabloMadel; } public String getKabloModel() { return kabloModel; } } |
Usb_Kablo sınıfı kodladık. Constructor(yapıcı) metot üzerinden kablo modeli bilgisine sahip olacağız.
|
1 2 3 4 5 6 7 8 9 |
package Abstract_Factory_Design_Pattern; public class Lg_Usb_Kablo extends Usb_Kablo { public Lg_Usb_Kablo() { super("LG Usb Kablo"); } } |
|
1 2 3 4 5 6 7 8 |
package Abstract_Factory_Design_Pattern; public class iPhone_Usb_Kablo extends Usb_Kablo{ public iPhone_Usb_Kablo() { super("iPhone USB Kablo"); } } |
Yukarıda Usb_Kablo sınıfının alt sınıflarını oluşturarak her marka için ayrı bir usb kablo sınıfı oluşturduk.
|
1 2 3 4 5 6 |
package Abstract_Factory_Design_Pattern; public interface Factory { public Sarj_Cihazi makeSarjCihazi(); public Usb_Kablo makeUsbKablo(); } |
Factory interface sınıfı bir fabrikada yapılması istenen işlemler için olması istenen metotları tanımladık.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package Abstract_Factory_Design_Pattern; public class LgFactory implements Factory { @Override public Sarj_Cihazi makeSarjCihazi() { return new Lg_Sarj_Cihazi(); } @Override public Usb_Kablo makeUsbKablo() { return new Lg_Usb_Kablo(); } } |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package Abstract_Factory_Design_Pattern; public class iPhoneFactory implements Factory { @Override public Sarj_Cihazi makeSarjCihazi() { return new iPhone_Sarj_Cihazi(); } @Override public Usb_Kablo makeUsbKablo() { return new iPhone_Usb_Kablo(); } } |
Yukarıda iPhone ve LG Factory interface alt sınıfları oluşturuldu. Bu sınıflar aracılığıyla her markanın sadece kendisine ait parçaların üretilmesi sağlanıyor.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package Abstract_Factory_Design_Pattern; public class FactoryMaker { public static Factory getFactory(String factoryName){ if(factoryName.equals("lg")) return new LgFactory(); else if(factoryName.equals("iphone")) return new iPhoneFactory(); return null; } } |
Yukarıda FactoryMaker sınıfında ise talep edilen marka parametre olarak alınarak bu markaya ait Factory alt interface sınıfı döndürülüyor.
|
1 2 3 4 5 6 7 8 9 10 11 |
package Abstract_Factory_Design_Pattern; public class Client { public void doSomeClientJob(String factoryName){ Usb_Kablo usbKablo=FactoryMaker.getFactory(factoryName).makeUsbKablo(); System.out.println(usbKablo.getKabloModel()); Sarj_Cihazi sarjCihazi=FactoryMaker.getFactory(factoryName).makeSarjCihazi(); System.out.println(sarjCihazi.getSarjCihaziModel()); } } |
Client sınıfı ile istenilen markaya özel kablo ve şarj cihazı FactoryMaker sınıfı kullanılarak üretimi sağlanıyor ve ekran çıktıları alınıyor.
|
1 2 3 4 5 6 7 8 |
package Abstract_Factory_Design_Pattern; public class Test { public static void main(String[] args) { Client client = new Client(); client.doSomeClientJob("lg"); } } |
Test sınıfımızda ise sadece lg markasını yazarak kullanıcı arkada hangi sınıf ve alt sınıfların çalışacağını bilmeden aşağıda ki çıktıyı elde ediyoruz.
![]()






