Middle
O que é o padrão de projeto Factory e como é utilizado na construção de objetos (Builder)?
sobes.tech IA
Resposta da IA
O padrão Factory Method fornece uma interface para criar objetos na classe base, permitindo que subclasses alterem o tipo de objetos criados. ConcreteFactory decide qual ConcreteProduct criar.
Builder separa a construção de um objeto complexo de sua representação. Ele permite criar o objeto passo a passo, fornecendo diferentes métodos para definir suas propriedades e retornando o objeto completo. É usado quando o objeto tem muitos parâmetros opcionais e sua criação requer lógica complexa.
A fábrica cria objetos inteiros, enquanto o construtor os cria por partes.
Exemplo:
// 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("Renderizando botão Windows")
}
override fun onClick() {
println("Clicando no botão Windows")
}
}
class HTMLButton : Button {
override fun render() {
println("Renderizando botão HTML")
}
override fun onClick() {
println("Clicando no botão HTML")
}
}
// 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)"
}
}
// Uso do Builder
val pizza = Pizza.Builder()
.size("large")
.cheese(true)
.pepperoni(true)
.build()
println(pizza)
Comparação:
| Característica | Factory Method | Builder |
|---|---|---|
| Propósito | Criar objetos por meio de interfaces em subclasses. | Criação passo a passo de objetos complexos. |
| Complexidade do objeto | Geralmente objetos simples. | Objetos complexos com múltiplos parâmetros. |
| Flexibilidade na criação | Escolha do tipo de objeto dependendo da subclasse. | Configuração progressiva das propriedades do objeto. |
| Retorno do objeto | Retorna um objeto pronto. | Retorna um objeto após a construção. |
| Aplicação | Frameworks, bibliotecas, onde o tipo de objeto não é conhecido na fase de compilação. | Objetos com muitos parâmetros opcionais. |