Middle
Mi az a Factory tervezési minta, és hogyan használják az objektumok (Builder) építésében?
sobes.tech MI
Válasz az MI-től
A Factory Method minta interfészt biztosít az objektumok létrehozásához az alap osztályban, lehetővé téve az alkosztályok számára, hogy megváltoztassák a létrehozott objektumok típusát. A ConcreteFactory dönti el, melyik ConcreteProduct-ot hozza létre.
A Builder elválasztja egy összetett objektum építését annak megjelenítésétől. Lehetővé teszi az objektum lépésenkénti létrehozását, különböző módszereket kínálva az tulajdonságainak beállítására, és visszaadja a kész objektumot. Akkor használják, amikor az objektumnak sok opcionális paramétere van, és a létrehozása összetett logikát igényel.
A Factory az egész objektumokat hozza létre, míg a Builder részekre bontja azokat.
Példa:
// 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("Windows gomb megjelenítése")
}
override fun onClick() {
println("Windows gombra kattintás")
}
}
class HTMLButton : Button {
override fun render() {
println("HTML gomb megjelenítése")
}
override fun onClick() {
println("HTML gombra kattintás")
}
}
// 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 = "közepes",
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)"
}
}
// Builder használata
val pizza = Pizza.Builder()
.size("nagy")
.cheese(true)
.pepperoni(true)
.build()
println(pizza)
Összehasonlítás:
| Jellemzők | Factory Method | Builder |
|---|---|---|
| Cél | Objektumok létrehozása alosztályokon keresztül. | Összetett objektumok lépésenkénti létrehozása. |
| Objektum összetettsége | Általában egyszerű objektumok. | Több paraméterrel rendelkező összetett objektumok. |
| Létrehozás rugalmassága | Objektum típusának kiválasztása az alosztály szerint. | Objektum tulajdonságainak lépésenkénti beállítása. |
| Objektum visszaadása | Kész objektumot ad vissza. | A létrehozás befejezése után adja vissza a kész objektumot. |
| Alkalmazás | Keretrendszerek, könyvtárak, ahol az objektum típusa nem ismert fordítási időben. | Nagy számú opcionális paraméterrel rendelkező objektumok. |