Benötige Denkanstoß zu Builder-Pattern Aufgabe

Rah2k

Mitglied
Hallo,

ich komme bei folgender Aufgabe irgendwie nicht weiter. Ich würde gerne ein Lösungsansatz präsentieren, aber es hackt schon bei der Herangehensweise... :(

Aufgabe:
Wichtig: Realisieren Sie dies mit Hilfe des Builder-Patterns und nutzen Sie Ihr Wissen über Method-Chaining und Fluent Interfaces.

"Zeigen Sie mit einem Code-Beispiel wie das Erstellen eines Warenkorbes und einer Bestellung mit einem Builder-Pattern geschehen wurde. Sie müssen den Builder an sich nicht implementieren. Die Nutzung des Builders soll so gestaltet werden, dass ein Warenkorb nur in Verbindung mit einem Kunden existieren kann. Außerdem soll ein Posten nicht ohne einen Warenkorb existieren können. Die Bestellung kann ausgelöst werden, wenn ein valider Warenkorb erzeugt wurde. Das Auslösen der Bestellung darf nicht Teil des Builder-Patterns sein, da der Bestellprozess zum späteren Zeitpunkt abgebrochen werden kann."

Zunächst hätte ich innerhalb der Warenkorb-Klasse die Bestellung-Klasse (nicht statisch) verschachtelt. Somit brauch ich für eine gültige Bestellung ein Objekt des Typs Warenkorb. Und dann evtl. die Warenkorb-Klasse in die Kunden-Klasse verschachteln?

Über Hilfe wäre ich sehr dankbar!

Gruß
 

MoxxiManagarm

Top Contributor
Du vergisst, dass du einen Builder brauchst. Ein Warenkorb ist kein Builder. Der Warenkorb ist das Produkt des Builders. Vielleicht hilft dir dieser Rahmen um deine Gedanken weiterzuverfolgen.

Java:
class ShoppingCartBuilder {
  // ...

   public ShoppingCartBuilder addProduct(Product product, int amount) {
     // ....
   }

   public ShoppingCartBuilder setCustomer(Customer customer) {
     // ....
   }

  // build abschließen "zur Kasse gehen"
  public ShoppingCart checkout() {
     // ....
  }
}

ShoppingCart cart = new ShoppingCartBuilder().setCustomer(customer).addProduct(chair, 4).addProduct(table, 1).checkout();
// anschließend Bestellung mit dem cart
 
Zuletzt bearbeitet:

MoxxiManagarm

Top Contributor
Die Nutzung des Builders soll so gestaltet werden, dass ein Warenkorb nur in Verbindung mit einem Kunden existieren kann.

Ich bin mir nicht sicher, ob damit ein Fehlerhandling in checkout() gemeint ist, oder eher das:
Java:
// setCustomer existiert hier nicht
ShoppingCart cart = new ShoppingCartBuilder(customer).addProduct(chair, 4).addProduct(table, 1).checkout();
 

Rah2k

Mitglied
Vielen Dank! Das hat mir schon sehr geholfen :)

Einziges Problem ist jetzt nur noch diese Teilaufgabe: "Außerdem soll ein Posten nicht ohne einen Warenkorb existieren können"

Java:
public class Produkt {
    private int artikelnr;
    private String bezeichnung;

    public Produkt(int artikelnr, String bezeichnung) {...}

    public String toString() {...}
}


public class Warenkorb {

    Kunde kunde;
    List<Produkt> produkte;

    private Warenkorb(Kunde k, List<Produkt> p) {
        kunde = k;
        produkte = p;
    }

    public static class WarenkorbBuilder {
        Kunde kunde;
        List<Produkt> produkte;

        public WarenkorbBuilder(Kunde k) {
            kunde = k;
            produkte = new ArrayList<>();
        }

        public WarenkorbBuilder produktHinzufuegen(Produkt produkt) {
            produkte.add(produkt);
            return this;
        }

        public Warenkorb build() {
            return new Warenkorb(kunde, produkte);
        }
    }

    public String toString() {...}
}

Das heißt ja, Produkt muss den Warenkorb kennen:

Java:
public class Produkt {
    ...
    Warenkorb warenkorb;

    public Produkt(int artikelnr, String bezeichnung, Warenkorb warenkorb) {
        ...
        this.warenkorb = warenkorb;
    }
}

Das wiederum würde aber den kompletten WarenkorbBuilder zerstören!? Denn ich muss vor dem Produkt bereits einen Warenkorb anlegen...

Edit: Produkt soll die Position sein, ungünstige Namenswahl :)
 

MoxxiManagarm

Top Contributor
Einziges Problem ist jetzt nur noch diese Teilaufgabe: "Außerdem soll ein Posten nicht ohne einen Warenkorb existieren können"

Produkt soll die Position sein, ungünstige Namenswahl
Ich habe es bei mir absichtlich nicht Position (engl. für Posten) genannt. Ein Produkt ist kein Posten und ein Produkt musst du dem Builder ergänzen können. Letztlich ist es eine Frage das Datentyps. Du darfst im Builder keine Liste von Posten führen, du brauchst da einen anderen Datentyp, z.B. Map<Product, Integer>. Der Warenkorb bekommt dann diese Map und erstellt sich aus dieser die Posten.
 

Neue Themen


Oben