Middle
Mis on Factory disainimuster ja kuidas seda kasutatakse objektide (Builder) ehitamisel?
sobes.tech AI
Vastus AI-lt
Factory Method muster pakub liidest objektide loomiseks alusklassis, võimaldades alamklassidel muuta loodavate objektide tüüpi. ConcreteFactory otsustab, millist ConcreteProduct luua.
Builder eraldab keeruka objekti konstrueerimise selle esindusest. See võimaldab luua objekti samm-sammult, pakkudes erinevaid meetodeid selle omaduste määramiseks ning tagastades valmis objekti. Seda kasutatakse, kui objektil on palju valikulisi parameetreid ning selle loomine nõuab keerulist loogikat.
Faktori kogu loob objekte täielikult, samas kui Konstruktor loob neid osade kaupa.
Näide:
// 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("Clicking Windows button")
}
}
class HTMLButton : Button {
override fun render() {
println("Rendering HTML button")
}
override fun onClick() {
println("Clicking 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)"
}
}
// Konstruktor kasutamine
val pizza = Pizza.Builder()
.size("large")
.cheese(true)
.pepperoni(true)
.build()
println(pizza)
Võrdlus:
| Omadus | Factory Method | Builder |
|---|---|---|
| Eesmärk | Objektide loomine alamklasside kaudu. | Keerukate objektide etapiline loomine. |
| Objekti keerukus | Tavaliselt lihtsad objektid. | Keerukad objektid paljude parameetritega. |
| Loomise paindlikkus | Objekti tüübi valik sõltuvalt alamklassist. | Etapiline objekti omaduste seadistamine. |
| Objekti tagastamine | Valmis objekt. | Valmis objekt pärast ehituse lõpetamist. |
| Rakendamine | Raamistikud, teegid, kus objekti tüüp on teadmata kompileerimise ajal. | Objektid, millel on palju valikulisi parameetreid. |