Java-Entwurfsmuster (design pattern): Abstract Factory

In diesem Artikel werden wir uns das letzte Entwurfsmuster (Java design pattern) aus der Kategorie der Muster zur Erstellung von Objekten (creational patterns) ansehen – Abstract Factory. Lies mehr über weitere Design Patterns – eine Serie von Entwurfsmustern:

Was ist das Entwurfsmuster Abstract Factory?

Das Entwurfsmuster Abstract Factory ist eines der sogenannten kreativen (creational) Entwurfsmuster im Software Engineering. Das Ziel dieses Musters ist es, eine Schnittstelle für die Erstellung von Familien verwandter Objekte bereitzustellen, ohne dass deren spezifische Klassen angegeben werden müssen.

Welches Problem löst das Entwurfsmuster Abstract Factory?

Abstract Factory löst das Problem der Erstellung von Instanzen von Klassen, die eine gemeinsame Schnittstelle haben oder zur selben Klassenfamilie gehören. Das Entwurfsmuster Abstract Factory basiert auf dem Prinzip der Abstraktion. Bietet eine Schnittstelle, die Methoden zur Erstellung von Objekten definiert. Spezifische Implementierungen dieser Schnittstelle werden durch einzelne Fabriken repräsentiert, die Instanzen bestimmter Klassen erstellen. Es hilft, den Prozess der Objekterstellung von deren Verwendung zu trennen und ermöglicht den einfachen Austausch einer gesamten Objektfamilie gegen eine andere, ohne den Code ändern zu müssen, der diese Objekte verwendet.

Beispiel einer Implementierung des Abstract Factory Entwurfsmusters in Java

Nun zeigen wir, wie das Entwurfsmuster Abstract Factory in Java implementiert wird. Dieses Beispiel veranschaulicht, wie das Abstract Factory Entwurfsmuster die Erstellung von Familien zusammenhängender Objekte ermöglicht, ohne ihre konkreten Klassen im Code anzugeben. In diesem Fall handelt es sich um eine Schokoladen- und Nougatfabrik des Herstellers Lindt. Schnittstelle CokoladaAbstractFactory – definiert zwei Methoden vyrobCokoladu() a vyrobNugat(), die Objekte vom Typ Cokolada und Nugat der entsprechenden Fabriken zurückgeben sollen. Diese Schnittstelle stellt eine abstrakte Schokoladenfabrik dar.

package designpatterns;

// Rozhranie pre abstraktnu vyrobnu cokoladu
public interface CokoladaAbstractFactory {
    Cokolada vyrobCokoladu();
    Nugat vyrobNugat();
}

Klasse LindtFactory – implementiert die Schnittstelle ChocolateAbstractFactory und bietet Implementierungen der Methoden makeChocolate() und makeNugat(). Diese Klasse ist eine konkrete Implementierung der abstrakten Schokoladenfabrik für den Hersteller Lindt.

package designpatterns;

// Vyrobca Lindt cokolady implementuje AbstractFactory
public class LindtFactory implements CokoladaAbstractFactory {
    public Cokolada vyrobCokoladu() {
        return new LindtCokolada();
    }

    public Nugat vyrobNugat() {
        return new LindtNugat();
    }
}

InterfaceChocolate – definiert die Methode displayType(), die in der Klasse LindtChocolate implementiert ist. Diese Schnittstelle stellt eine Art von Schokolade dar.

package designpatterns;

// Rozhranie pre cokoladu
public interface Cokolada {
    void zobrazTyp();
}

Klasse LindtChocolate – implementiert die Schnittstelle Chocolate und definiert eine displayType()-Methode, die Informationen über die Schokolade ausgibt.

package designpatterns;

// Konkretna implementacia Lindt cokolady
public class LindtCokolada implements Cokolada {
    public void zobrazTyp() {
        System.out.println("Lindt čokoláda");
    }
}

Nugat-Schnittstelle – definiert eine displayType()-Methode, die in der Klasse LindtNugat implementiert ist. Diese Schnittstelle stellt die Art des Nugats dar.

package designpatterns;

// Rozhranie pre nugat
public interface Nugat {
    void zobrazTyp();
}

Klasse LindtNugat – implementiert die Schnittstelle Nugat und definiert eine displayType()-Methode, die Informationen über den Nougat ausgibt.

package designpatterns;

// Konkretna implementacia Lindt nugatu
public class LindtNugat implements Nugat {
    public void zobrazTyp() {
        System.out.println("Lindt nugát");
    }
}

Klasse Main: Enthält die main()-Methode, in der die Verwendung der abstrakten Fabrik demonstriert wird. Es wird eine LindtFactory-Instanz erstellt, die vom Typ CokoladaAbstractFactory ist. Anschließend werden die Objekte Cokolada und Nugat mithilfe dieser abstrakten Fabrik erstellt. Schließlich werden die showType()-Methoden auf diesen Objekten aufgerufen, die die Informationen zu Schokolade und Nougat ausgeben.

import designpatterns.Cokolada;
import designpatterns.CokoladaAbstractFactory;
import designpatterns.LindtFactory;
import designpatterns.Nugat;

// Priklad pouzitia Abstract Factory
public class Main {
    public static void main(String[] args) {
        // Vytvorenie abstraknej tovarne na cokoladu
        CokoladaAbstractFactory cokoladaFactory = new LindtFactory();

        // Vyroba cokolady a nugatu pomocou abstraktnej tovarne
        Cokolada cokolada = cokoladaFactory.vyrobCokoladu();
        Nugat nugat = cokoladaFactory.vyrobNugat();

        // A zobrazenie informacii o nich
        cokolada.zobrazTyp();
        nugat.zobrazTyp();
    }
}

Beachte, dass durch die Verwendung vom Abstract Factory die Instanz von LindtFactory problemlos gegen eine andere Instanz ausgetauscht werden kann, die das CokoladaAbstractFactory-Interface implementiert, ohne den restlichen Code ändern zu müssen. Wir könnten zum Beispiel eine MilkaFactory erstellen, um Milchschokolade zu produzieren.

Programmausgabe mit dem Entwurfsmuster Abstract Factory
Programmausgabe mit dem Entwurfsmuster Abstract Factory
Wir haben Dateien mit dem obigen Beispiel in Form von Code vorbereitet, den Sie direkt in Java ausführen können. Laden Sie den Java Abstract Factory Code hier herunter. Wenn Sie auf der Suche nach einem Job sind und Java-Programmierer sind, lesen Sie mehr über das Gehalt von Programmierern und sehen Sie sich unsere Stellenangebote an.

Über den Autor

Jozef Wagner

Java Developer Senior

Viac ako 10 rokov programujem v Jave, momentálne pracujem v msg life Slovakia ako Java programátor senior a pomáham zákazníkom implementovať ich požiadavky do poistného softvéru Life Factory. Vo voľnom čase si rád oddýchnem v lese, prípadne si zahrám nejakú dobrú počítačovú hru.

Informieren Sie uns über sich