Tasarım Kalıpları: Abstract Factory Kalıbı (Soyut Üretici)

Nesne yaratma kalıplarından bir diğeri de Abstract Factory’dir. Soyut üretici olarak da dilimize çevrilebilecek olan bu kalıbın amacıyla ilgili GoF’da şu bilgiler bulunmaktadır:

Intent:  Provide an interface for creating families of related or dependent objects without specifying their concrete classes. Factory Method lets a class defer instantiation to subclasses.

Amaç: Birbirleriyle ilgili ya da bağımlı nesne ailelerini, nesnelerin somut sınıflarını belirtmeden yaratmak için bir arayüz sağlamak. Factory Method bir sınıfın nesnesinin yaratılmasını, alt sınıflara ertelemesine izin verir.

Factory Method ile Abstract Factory kalıpları genelde karıştırılır. Factory Method tek nesne, Abstract Factory ise tek nesne yerine, nesne ailesi oluşturmak üzere kullanılan bir kalıptır. Abstract Factory bir sınıftır, Factory Method ise bir metottur. Abstract Factory, birden fazla Factory Method kullanarak oluşturulabilir. Abstract Factory, genelde birbirleriyle ilgili nesne ailelerini ya da gruplarını oluşturmakta kullanılır. Dolayısıyla Abstract Factory üzerinde ailenin her ferdi için ayrı bir Factory Method bulunur.

Yukarıdaki modeldeki kod örneklerine bakarsak, Component arayüzü aşağıdaki gibidir:

package org.javaturk.dp.pattern.gof.creational.abstractFactory.gui;

public interface Component {
	public void paint();
}

Bileşenlerden olan Button sınıfı ise abstract olup aşağıdaki gibidir:

package org.javaturk.dp.pattern.gof.creational.abstractFactory.gui;

public abstract class Button implements Component{
    public abstract void paint();
}

Button‘un bir alt sınıfı olan OSXButton ise şöyledir:

package org.javaturk.dp.pattern.gof.creational.abstractFactory.gui;

public class OSXButton extends Button {
    public void paint() {
        System.out.println("Painting an OSX Button!");
    }
}

Diğer tarafta ise AbstractFactory’nin sınıfları bulunur. İlki bir arayüz olan GUIFactory‘dir:

package org.javaturk.dp.pattern.gof.creational.abstractFactory.gui;

interface GUIFactory {
    public Component createButton();
    
    public Component createList();
    
    public Component createTable();
}

GUIFactory‘nin bir gerçekleştirmesi ise OSXFactory’dir.

package org.javaturk.dp.pattern.gof.creational.abstractFactory.gui;

public class OSXFactory implements GUIFactory {

    public Button createButton() {
        return new OSXButton();
    }

	@Override
	public List createList() {
		return new OSXList();
	}

	@Override
	public Table createTable() {
		return new OSXTable();
	}
}

Bu durumda Client kodumuz da şöyle olacaktır:

package org.javaturk.dp.pattern.gof.creational.abstractFactory.gui;

class Client {
    public Client(GUIFactory factory){
        Component button = factory.createButton();
        button.paint();
        
        Component list = factory.createList();
        list.paint();
        
        Component table = factory.createTable();
        table.paint();
    }
}

Abstract Factory kalıbı, ürün aileleri ve onları üreten nesnelerle ilgili sistematik bir isimlendirme sağlar. Sisteme yeni bir nesnenin (ScrollBar) katılması durumunda hem Abstract Factory’e hem de alt sınıf olan üreticilerine (OSXFactory ve WinFactory) gerekli factory metotlarının (createScrollBar()) eklenmesi gereklidir. Yeni bir aile (XWindows) eklenmesi durumunda ise her nesnenin o aileye ait alt sınıfı (XWindowsButton, …) ile üretici alt sınıfının (XWindowsFactory) sisteme eklenmesi gereklidir.

Java APIlerinde pek çok Abstract Factory kullanımı vardır:

  • javax.xml.parsers.DocumentBuilderFactory newDocumentBuilder()
  • javax.xml.transform.TransformerFactory newTransformer()
  • javax.xml.xpath.XPathFactory newInstance()

Abstract Factory, Factory Method’u sıklıkla kullanılır. Factory Method bir metot iken, Abstract Factory bir sınıftır. Dolayısıyla Abstract Factory bir üst soyutlama yapısı sağlar. Factory Method bir nesne için bir yaratma yöntemi sağlarken, Abstract Factory bir nesne için birden fazla yaratma yöntemi sağlar. 

Ayrıca Abstract Factory, Factory Method yanında Builder ve Prototype da kullanılır.

Toplam görüntülenme sayısı: 2726