Назад к вопросам
Middle
67
questionbank
Что такое паттерн проектирования Factory и как он используется в строительстве объектов (Builder)?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Паттерн Factory Method предоставляет интерфейc для создания объектов в базовом классе, позволяя подклассам изменять тип создаваемых объектов. 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 |
|---|---|---|
| Назначение | Создание объектов по интерфейсу подклассами. | Поэтапное создание сложных объектов. |
| Сложность объекта | Обычно простые объекты. | Сложные объекты с множеством параметров. |
| Гибкость создания | Выбор типа объекта в зависимости от подкласса. | Пошаговое настройка свойств объекта. |
| Возврат объекта | Возвращает готовый объект. | Возвращает готовый объект после завершения построения. |
| Применение | Фреймворки, библиотеки, где тип объекта неизвестен на этапе компиляции. | Объекты с большим количеством необязательных параметров. |