O Builder é um padrão de projeto criacional, este facilita a criação de objetos complexos que são compostos por vários campos e objetos agrupados, permitindo a representação de diferentes versões deste objeto usando o mesmo código de construção.
Exemplo de código em Python
class Builder(ABC):
@abstractproperty
def product(self) -> None:
pass
@abstractmethod
def produce_part_a(self) -> None:
pass
@abstractmethod
def produce_part_b(self) -> None:
pass
@abstractmethod
def produce_part_c(self) -> None:
pass
A classe Builder representa a interface que especifica os métodos para criar as diferentes partes do objeto.
class ConcreteBuilder1(Builder):
def __init__(self) -> None:
self.reset()
def reset(self) -> None:
self._product = Product1()
@property
def product(self) -> Product1:
product = self._product
self.reset()
return product
def produce_part_a(self) -> None:
self._product.add("PartA1")
def produce_part_b(self) -> None:
self._product.add("PartB1")
def produce_part_c(self) -> None:
self._product.add("PartC1")
A classe ConcreteBuilder segue as especificações da interface Builder e provê nos seus métodos as implementações especificas do seu objeto. Estas especificações são necessárias uma vez que diferentes builders podem criar objetos completamente diferentes. A função reset é chamada para garantir que o ao final da criação de um objeto o builder esteja pronto para criar outro.
class Product1():
def __init__(self) -> None:
self.parts = []
def add(self, part: Any) -> None:
self.parts.append(part)
def list_parts(self) -> None:
print(f"Product parts: {', '.join(self.parts)}", end=""
if __name__ == "__main__":
builder = ConcreteBuilder1()
print("Custom product: ")
builder.produce_part_a()
builder.produce_part_b()
builder.product.list_parts()
)
A classe Product1 representa uma instância de produto que vai ser criado utilizando os passos especificados no builder. No main está um exemplo de objeto criado pelo builder.
A implementação em Python não tem nenhuma particularidade em relação a implementação em Java.
Referências
Padrões de Projeto (Diogo Moreira, 2020)
Mergulho nos Padrões de Projeto - v2020-1.14 (Alexander Shvets, 2020)
Os códigos usados como exemplo foram retirados do livro Mergulho nos Padrões de Projeto.
Top comments (0)