# Benötige Denkanstoß zu Builder-Pattern Aufgabe



## Rah2k (6. Feb 2020)

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 (7. Feb 2020)

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.


```
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
```


----------



## MoxxiManagarm (7. Feb 2020)

Rah2k hat gesagt.:


> 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:

```
// setCustomer existiert hier nicht
ShoppingCart cart = new ShoppingCartBuilder(customer).addProduct(chair, 4).addProduct(table, 1).checkout();
```


----------



## Rah2k (7. Feb 2020)

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_"


```
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:


```
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 (7. Feb 2020)

Rah2k hat gesagt.:


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





Rah2k hat gesagt.:


> 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.


----------

