Oluşturucu (Creational) tasarım şablonlarından biridir. Spring ve Struts gibi çerçevelerde yaygın olarak kullanılmaktadır.
Fabrika şablonu, birden fazla alt-sınıf ve süper sınıfa sahip olduğumuzda kullanılır. Kullanıcı sınıf, hangi alt sınıfların kullanılması gerektiğini veya nasıl nesne üretilmesi geretiğin bilmiyorsa bu tasarım şablonunu kullanmak en uygunu olacaktır. Bu kalıp, bir sınıfın istemci tarafından fabrika sınıfına örneklenmesinin sorumluluğunu üstlenir.
Bu modelde süper sınıf bir interface(arayüz), abstract(soyut) sınıf veya normal bir somut sınıf olabilir. Örneğimiz için, test amaçlı olarak doküman tiplerini döndüren yöntemiyle bir interface var.
1 2 3 4 5 |
public interface Document { public String getDocumentType(); } |
Şimdi bu interface’i implement eden alt sınıflarımızı oluşturalım.
1 2 3 4 5 6 7 8 |
public class Pdf implements Document { @Override public String getDocumentType() { return "Pdf"; } } |
1 2 3 4 5 6 7 8 |
public class Word implements Document { @Override public String getDocumentType() { return "Word"; } } |
Artık süper sınıflarımız ve alt sınıflarımız hazır, şimdi fabrika sınıfımızı yazabiliriz.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class DocumentFactory { public static Document createDocument(String type){ if("PDF".equals(type)){ return new Pdf(); } else if("WORD".equals(type)){ return new Word(); } else { throw new RuntimeException("Doküman tipi belli değil!"); } } } |
Test sınıfımız ile uygulamamızı test edebiliriz. Artık DocumentFactory sınıfı gönderilen parametreyi değerlendirerek, gerekli soyut sınıfı bulur ve doküman nesnesini üretir.
1 2 3 4 5 6 7 8 9 10 |
public class TestFactory { public static void main(String[] args) { Document document = DocumentFactory.createDocument("PDF"); System.out.println(document.getDocumentType()); document = DocumentFactory.createDocument("WORD"); System.out.println(document.getDocumentType()); } } |
JDK’ da örnekleri
- java.util.Calendar, ResourceBundle ve NumberFormat.getInstance() metodu
- Nesnelerdeki valueOf() metodu
Ellerine sağlık, çok faydalı.