Yaratımsal tasarım kalıplarından olan bu metot, üretimle ilgili tasarımlarda önem kazanmaktadır. Fabrika ve ürün grubu gibi ilişkiler bir kez tanımlanır. Bu tasarımda önemli olan yapısal olarak birbirine benzeyen ürünlerin ortak bir ara katman üzerinden yönetilebilmesini sağlamaktır. Bu şekilde kurulan yapı daha kolay ve esnek olur. Tek arayüz kullanarak bir nesne ailesinin farklı platformlarda yaratılmasına olanak sağlar ve uygulama davranış değişikliğine uğramadan farklı platformlara taşınabilir. Soyut fabrika tasarım kalıbının en belirgin özelliği, üretilecek nesnelerin birbirleriyle ilişkili olmasıdır. Oluşturulan bu yapıda üretilen nesnelerin kendisiyle ilgilenmeye gerek yoktur. Diğer bir deyişle üretim sınıfında, üretimin yapılacağı fabrikanın hangi fabrika olduğu veya üretilen nesnelerin hangi tür olduğu ile ilgilenilmez. Bu sayede aynı arayüzü veya soyut sınıfı kullanarak yeni nesneleri kalıba eklemek kolaylaştırılmıştır.
Soyut fabrika metodunun temel yapısı aşağıdaki şekildedir.
Soyut fabrika tasarım kalıbı için Java yazılım diliyle hazırlanan örnek programın şeması aşağıdaki şekilde verilmiştir.
Nesneye dayalı programlamada arayüz (interface), bir sınıfta olması gereken metot ve özellikleri (property) tanımlayan yapıdır. Bu yapı, normal sınıf yapısından farklı olarak uygulamada neyin yapılacağını gösterir, fakat nasıl yapılacağı konusunu kendisinden türeyen sınıflara bırakır. Bu şekilde kalıtım sağlanmış olur. Bir sınıfın, arayüzdeki bütün metod ve özellikleri uygulamasına tamamlama (implementation) denir ve bu işlem implements kod parçasından yararlanılarak yapılır.
Aşağıdaki örnek uygulamada arayüzlerden yararlanılmıştır. Görüldüğü gibi GUIFactory ve Button arayüzleri yazılmış ve bu arayüzleri uygulayan WinFactory, WinButton ve OSXFactory, OSXButton sınıfları yazılmıştır. Bu sınıflarda da arayüzde verilen metodlar devre dışı bırakılmış (override) ve sınıfın türüne göre aynı arayüzün metodunun farklı sınıflarda neler yapacağı belirtilmiştir.
Son olarak da Application ve ApplicationRunner sınıfları yazılmıştır. ApplicationRunner sınıfında, belirtilen dosyadan yaratılacak fabrikanın hangi tip olacağı okunur ve okunan değere göre kullanılacak fabrika belirlenir.
Application sınıfının yapıcı metodunda, okunan fabrika tipine göre oluşturulacak buton, override edilmiş createButton metodu kullanılarak oluşturulur.
Programın ekran çıktısı kullanılan fabrikanın tipine göre WinButton veya OSXButton olacaktır. Bununla birlikte, uygulama ne çeşit fabrika verildiğini ve fabrikanın ne çeşit buton üreteceğini bilemez.
Java Soyut Fabrika Örneği (Abstract Factory Example)
interface GUIFactory
{
public Button createButton();
}
class WinFactory implements GUIFactory
{
public Button createButton()
{
return new WinButton();
}
}
class OSXFactory implements GUIFactory
{
public Button createButton()
{
return new OSXButton();
}
}
interface Button
{
public void paint();
}
class WinButton implements Button
{
public void paint()
{
System.out.println("WinButton");
}
}
class OSXButton implements Button
{
public void paint()
{
System.out.println("OSXButton");
}
}
class Application
{
public Application(GUIFactory factory)
{
Button button = factory.createButton();
button.paint();
}
}
public class ApplicationRunner
{
public static void main(String[] args)
{
new Application(createOsSpecificFactory());
}
public static GUIFactory createOsSpecificFactory() {
int sys = readFromConfigFile("OS_TYPE");
if (sys == 0)
{
return new WinFactory();
}
else
{
return new OSXFactory();
}
}
}