Seite 1 von 1

Abstract Factory Design Pattern

Verfasst: 26. Feb 2013 19:08
von mahi
Was ist mit "Austausch von Produktfamilien ist einfach" explizit gemeint? Etwa dass man in Laufzeit ein Produkt ändern kann, sprich

AbstractProductB a=new createProdA();

dann könnte ich a ersetzen mit einer anderen Instanz (in Laufzeit) deren Klasse die Interface AbstractProductB implementiert. Was genau ist mit "Familien austauschen" gemeint?!

Gruß

Re: Abstract Factory Design Pattern

Verfasst: 26. Feb 2013 19:41
von genix
Hi,

nehmen wir man das Beispiel einer Datenbankverbindung:

Code: Alles auswählen

public interface AbstractDatabaseFactory {
    public DatabaseQuery createQuery(String query);
}

public class MySQLDatabase implements AbstractDatabaseFactory {
    public DatabaseQuery createQuery(String query){
         return new MySQLQuery(query);
   }
}

public class OtherDatabase implements AbstractDatabaseFactory {
    public DatabaseQuery createQuery(String query){
        return new OtherQuery(query);
   }
}

public interface DatabaseQuery {
    public boolean execute();
}

public class MySQLQuery implements DatabaseQuery {
    public MySQLQuery(String query){}
    public boolean execute(){
        // execute query
        return true;
    }
}

public class OtherQuery implements DatabaseQuery {
    public OtherQuery(String query){}
    public boolean execute(){
        return true;
    }
}

public class Client {
    public static void main(String[] args){
        // create mysql first
        AbstractDatabaseFactory database = new MySQLDatabase();
        DatabaseQuery query = database.createQuery("SHOW TABLES");
        query.execute();

        //exchange database with OtherDatabase
        database = new OtherDatabase();
        query = database.createQuery("SHOW TABLES");
        query.execute();
    }
}
In dem Beispiel habe ich nun das gesamte Verhalten von Query (MySQLQuery könnte intern komplett andere Sachen machen als OtherQuery) und Datenbank mit dem Austausch der Factory geändert. Also durch den Austauch von MySQLDatabase durch OtherDatabase habe ich eine ganze Produktfamilie ausgetauscht.

Ich hoffe es haben sich keine Fehler eingeschlichen.

Grüße.

Edit: interfaces statt abstract classes

Re: Abstract Factory Design Pattern

Verfasst: 26. Feb 2013 20:13
von hy57muxu
An sich ists richtig, allerdings müssen deine abstracten Classen nicht abstract sein, sondern interfaces.
Auch wenn es verwirrend ist, weils abstract factory heißt, ich habe bei der Übung Punktabzug bekommen, weil ich die abstract hatte.
Ist halt doof, wenn man nen Constructor braucht, weil den kann man im Interface nicht berücksichtigen.

Re: Abstract Factory Design Pattern

Verfasst: 26. Feb 2013 20:28
von genix
Hi,

danke für den Hinweis, ist verbessert, hab mich da wohl vom Namen in die Irre führen lassen :)

Re: Abstract Factory Design Pattern

Verfasst: 26. Feb 2013 21:02
von errt
hy57muxu hat geschrieben:An sich ists richtig, allerdings müssen deine abstracten Classen nicht abstract sein, sondern interfaces.
Auch wenn es verwirrend ist, weils abstract factory heißt, ich habe bei der Übung Punktabzug bekommen, weil ich die abstract hatte.
Finde ich ein bisschen seltsam. Schließlich sind die Patterns ja sprachunabhängig definiert, im GoF in erster Linie für C++. Und interfaces sind ja nun eine Java-Besonderheit, die im Endeffekt ja auch nichts anderes als abstrakte Klassen darstellen, mit ein paar zusätzlichen Beschränkungen eben.

Re: Abstract Factory Design Pattern

Verfasst: 26. Feb 2013 21:06
von genix
Ja, laut wikipedia scheint das auch richtig zu sein, aber ich will da dann lieber doch nicht vom Gesagten in der Vorlesung abweichen...

Re: Abstract Factory Design Pattern

Verfasst: 26. Feb 2013 21:20
von mahi
Super Beispiel, Danke ;- )