Middle
Was ist das Factory-Design-Pattern und wie wird es beim Bau von Objekten (Builder) verwendet?
sobes.tech KI
Antwort von AI
Das Factory Method-Muster stellt eine Schnittstelle zum Erstellen von Objekten in der Basisklasse bereit, wobei Unterklassen den Typ der erstellten Objekte ändern können. ConcreteFactory entscheidet, welches ConcreteProduct erstellt wird.
Builder trennt die Konstruktion eines komplexen Objekts von seiner Darstellung. Er ermöglicht die schrittweise Erstellung des Objekts, indem er verschiedene Methoden zum Festlegen seiner Eigenschaften bereitstellt und das fertige Objekt zurückgibt. Er wird verwendet, wenn das Objekt viele optionale Parameter hat und seine Erstellung komplexe Logik erfordert.
Die Fabrik erstellt vollständige Objekte, während der Builder sie in Teilen erstellt.
Beispiel:
// Factory Method
interface Dialog {
fun createButton(): Button
fun render() {
val okButton = createButton()
okButton.render()
}
}
class WindowsDialog : Dialog {
override fun createButton(): Button {
return WindowsButton()
}
}
class WebDialog : Dialog {
override fun createButton(): Button {
return HTMLButton()
}
}
interface Button {
fun render()
fun onClick()
}
class WindowsButton : Button {
override fun render() {
println("Rendering Windows-Button")
}
override fun onClick() {
println("Klick auf Windows-Button")
}
}
class HTMLButton : Button {
override fun render() {
println("Rendering HTML-Button")
}
override fun onClick() {
println("Klick auf HTML-Button")
}
}
// Builder
class Pizza private constructor(
private val size: String,
private val cheese: Boolean,
private val pepperoni: Boolean,
private val mushrooms: Boolean
) {
data class Builder(
var size: String = "medium",
var cheese: Boolean = false,
var pepperoni: Boolean = false,
var mushrooms: Boolean = false
) {
fun size(size: String) = apply { this.size = size }
fun cheese(cheese: Boolean) = apply { this.cheese = cheese }
fun pepperoni(pepperoni: Boolean) = apply { this.pepperoni = pepperoni }
fun mushrooms(mushrooms: Boolean) = apply { this.mushrooms = mushrooms }
fun build() = Pizza(size, cheese, pepperoni, mushrooms)
}
override fun toString(): String {
return "Pizza(size='$size', cheese=$cheese, pepperoni=$pepperoni, mushrooms=$mushrooms)"
}
}
// Verwendung des Builders
val pizza = Pizza.Builder()
.size("large")
.cheese(true)
.pepperoni(true)
.build()
println(pizza)
Vergleich:
| Merkmal | Factory Method | Builder |
|---|---|---|
| Zweck | Erstellen von Objekten durch Schnittstellen in Unterklassen. | Schrittweise Erstellung komplexer Objekte. |
| Objektkomplexität | In der Regel einfache Objekte. | Komplexe Objekte mit vielen Parametern. |
| Flexibilität bei der Erstellung | Auswahl des Objekttyps je nach Unterklasse. | Schrittweise Konfiguration der Eigenschaften des Objekts. |
| Rückgabe des Objekts | Gibt ein fertiges Objekt zurück. | Gibt ein fertiges Objekt nach Abschluss der Konstruktion zurück. |
| Anwendung | Frameworks, Bibliotheken, bei denen der Objekttyp zur Kompilierungszeit unbekannt ist. | Objekte mit vielen optionalen Parametern. |