Middle
Co je to návrhový vzor Factory a jak se používá při stavbě objektů (Builder)?
sobes.tech AI
Odpověď od AI
Vzor Factory Method poskytuje rozhraní na vytváranie objektov v základnej triede, čo umožňuje podtriedam meniť typ vytváraných objektov. ConcreteFactory rozhoduje, ktorý ConcreteProduct vytvoriť.
Builder oddeľuje konštrukciu zložitých objektov od ich prezentácie. Umožňuje vytvárať objekt krok za krokom, poskytuje rôzne metódy na nastavenie jeho vlastností a vracia hotový objekt. Používa sa, keď má objekt veľa voliteľných parametrov a jeho vytvorenie vyžaduje zložitú logiku.
Fabrika vytvára celé objekty, zatiaľ čo Tvorca ich vytvára po častiach.
Príklad:
// 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("Vykresľovanie Windows tlačidla")
}
override fun onClick() {
println("Kliknutie na Windows tlačidlo")
}
}
class HTMLButton : Button {
override fun render() {
println("Vykresľovanie HTML tlačidla")
}
override fun onClick() {
println("Kliknutie na HTML tlačidlo")
}
}
// 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 = "stredná",
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)"
}
}
// Použitie Buildera
val pizza = Pizza.Builder()
.size("veľká")
.cheese(true)
.pepperoni(true)
.build()
println(pizza)
Porovnanie:
| Charakteristika | Factory Method | Builder |
|---|---|---|
| Účel | Vytváranie objektov pomocou podtried. | Postupné vytváranie zložitých objektov. |
| Zložitosť objektu | Zvyčajne jednoduché objekty. | Zložité objekty s viacerými parametrami. |
| Flexibilita vytvárania | Výber typu objektu podľa podtriedy. | Postupné nastavovanie vlastností objektu. |
| Vrátenie objektu | Vráti hotový objekt. | Vráti hotový objekt po dokončení konštrukcie. |
| Použitie | Frameworky, knižnice, kde typ objektu nie je známy v čase kompilácie. | Objekty s veľkým počtom voliteľných parametrov. |