Middle
Factory დიზაინის ნიმუში რა არის და როგორ გამოიყენება ობიექტების (Builder) მშენებლობაში?
sobes.tech AI
პასუხი AI-სგან
Factory Method ნიმუში უზრუნველყოფს ინტერფეისს ობიექტების შექმნისთვის ბაზის კლასში, რაც საშუალებას აძლევს ქვესაფარს შეცვალოს შექმნილი ობიექტების ტიპი. ConcreteFactory გადაწყვეტს, რომელი ConcreteProduct უნდა შექმნას.
Builder отделяет конструирование сложного объекта от его представления. Он позволяет создавать объект пошагово, предоставляя различные методы для задания его свойств и возвращая готовый объект. Он используется, когда объект имеет множество необязательных параметров и его создание требует сложной логики.
Фабрика создает объекты целиком, а Строитель создает их по частям.
Пример:
// 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)"
}
}
// გამოყენება Builder-ის
val pizza = Pizza.Builder()
.size("large")
.cheese(true)
.pepperoni(true)
.build()
println(pizza)
შედარება:
| ხასიათი | Factory Method | Builder |
|---|---|---|
| დანიშნულება | ობიექტების შექმნა ქვესაფრის ინტერფეისით. | რთული ობიექტების ეტაპობრივად შექმნა. |
| ობიექტის სირთულე | ჩვეულებრივ, მარტივი ობიექტები. | რთული ობიექტები მრავალი პარამეტრით. |
| შექმნის მოქნილობა | ობიექტის ტიპის არჩევა ქვესაფრის მიხედვით. | ობიექტის თვისებების ეტაპობრივი კონფიგურაცია. |
| ობიექტის დაბრუნება | მზად ობიექტის დაბრუნება. | დასრულებული ობიექტის დაბრუნება მშენებლობის შემდეგ. |
| გამოყენება | ფრეიმვორკები, ბიბლიოთეკები, სადაც ობიექტის ტიპი უცნობია კომპილაციის ეტაპზე. | ობიექტები დიდი რაოდენობით არასავალდებულო პარამეტრებით. |