DEV Community

Michel Moreira
Michel Moreira

Posted on

Padrão Builder em Python

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
Enter fullscreen mode Exit fullscreen mode

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")
Enter fullscreen mode Exit fullscreen mode

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()
)
Enter fullscreen mode Exit fullscreen mode

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)