Oluşturucu (Creational) tasarım şablonlarından biridir. Birbiriyle ilişkili nesne grupları (nesne ailesi) oluşturmak için bu şablon kullanılır. Soyut Fabrika sınıfı interface sınıfı olarak tanımlanır ve bu interface içerisinde aynı aileden nesneler oluşturmak için metotlar tanımlanır. Her nesne ailesi bir interface sınıfı ile temsil edilir.
Java’da fabrika tasarım modeline aşina iseniz, sağlanan alt nesneleri döndüren tek bir fabrika sınıfına sahip olduğumuzu ve fabrika sınıfının if-else veya switch deyimini kullandığını fark edersiniz.
Soyut Fabrika modelinde, if-else bloğundan kurtulup, her bir alt sınıf için bir fabrika sınıfına ve alt-sınıfı döndürecek bir Soyut Fabrika sınıfına sahibiz. İlk başta kafa karıştırıcı görünüyor ama uygulamayı gördüğünüzde, Fabrika ve Soyut Fabrika deseni arasındaki nüansı kavramak ve anlamak gerçekten çok kolay. Bu sebeple Fabrika tasarım şablonundaki aynı örneklerle açıklamaya çalışacağım.
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"; } } |
Sonrasında soyut fabrika sınıfımızı oluşturalım;
1 2 3 4 5 |
public interface DocumentAbstractFactory { public Document createDocument(); } |
Alt sınıflardaki somut nesnelerimiz için somut fabrika sınıflarımızı oluşturuyoruz;
1 2 3 4 5 6 7 8 |
public class PdfFactory implements DocumentAbstractFactory { @Override public Document createDocument() { return new Pdf(); } } |
1 2 3 4 5 6 7 |
public class WordFactory implements DocumentAbstractFactory { @Override public Document createDocument() { return new Word(); } } |
Son olarak, soyut fabrika sınıfımızı kullanan somut bir sınıf oluşturalım;
1 2 3 4 5 6 |
public class DocumentFactory { public static Document createDocument(DocumentAbstractFactory documentAbstractFactory){ return documentAbstractFactory.createDocument(); } } |
Tasarımımızı tamamladık ve şimdi test edelim. Test sınıfımız;
1 2 3 4 5 6 7 8 9 10 11 12 |
public class Test { public static void main(String[] args) { Document document = DocumentFactory.createDocument(new PdfFactory()); System.out.println(document.getDocumentType()); document = DocumentFactory.createDocument(new WordFactory()); System.out.println(document.getDocumentType()); } } |
Yararları nelerdir ?
- Soyut Fabrika şablonu, interface üzerine yaklaşım sağlar.
- Soyut Fabrika şablonu “fabrikaların fabrikası” dır ve daha fazla ürünü karşılamak için kolayca genişletilebilir, örneğin başka bir alt sınıf olsaydı örneğin Excel bunun için ExcelFactory fabrika sınıfını eklememiz yeterli olacaktır.
- Soyut Fabrika şablonu sağlamdır ve Fabrika modelinin koşullu mantığından kaçınır.
JDK’ da örnekleri
- javax.xml.parsers.DocumentBuilderFactory#newInstance()
- javax.xml.transform.TransformerFactory#newInstance()
- javax.xml.xpath.XPathFactory#newInstance()
Ellerinize sağlık çok güzel ve anlaşılır bir makale olmuş