Когда-то у одного бизнесмена возникла творческая идея.
Он хотел продавать автомобили с индивидуальным дизайном, предлагая покупателю возможность выбирать каждую мельчайшую деталь.
Через несколько месяцев инженеры придумали большой проект завода, где необходимо построить тысячи производственных линий, чтобы охватить все возможные комбинации. Бизнесмен разочаровался, его мечта казалась несбыточной.

Он сидел в баре и пил свое горе, когда к нему подошла дама и спросила о причине его печали.
Он рассказал ей свою историю, и вдруг она расхохоталась.
Он спросил ее: «Почему ты смеешься». ?»
она сказала Строитель, Строитель Строитель — это решение!

Builder – это творческий шаблон проектирования, упрощающий процесс создания сложных объектов с большим количеством атрибутов в различных возможных комбинациях. Процесс создания выполняется шаг за шагом аддитивным способом.

Возвращаясь к нашей истории, как человек решит свою проблему с помощью Design Pattern Builder?
Он построит единую конвейерную линию сборки, где есть несколько остановок. на каждой остановке к продукту добавляется новая деталь (функция). Для продукта не обязательно проходить все остановки, продукт может перепрыгнуть через некоторые из них.
Следуя этой логике, мы можем иметь продукты с широкими возможностями настройки, используя одну и ту же производственную линию.

Как написать Builder на Python?

Я искал в Интернете, пытаясь выяснить, как люди подошли бы к Builder в Python, и я обнаружил, что все представляют один и тот же способ сделать это, а именно создание класса Product. , класс Builder и класс Director. Но здесь я представлю другой способ сделать это, и он взят из мира Java.

class Laptop:
    
    def __init__(self,cpu = None, ram = None, storage = None):
        self.cpu = cpu
        self.ram = ram
        self.storage = storage
              
    
    def to_string(self):
        return f"""Configurations are: \
        CPU: {self.cpu}
        RAM: {self.ram}
        STORAGE: {self.storage}"""

        
    class Builder:
        
        def __init__(self):
            self.cpu = "i3"
            self.ram = "4GB"
            self.storage = "128GB"
            
        def set_cpu(self,cpu):
            self.cpu = cpu
            return self
            
        def set_ram(self,ram):
            self.ram = ram
            return self

        def set_storage(self,storage):
            self.storage = storage
            return self
        
        def build(self):
            return Laptop(self.cpu, self.ram, self.storage)

Мы определили класс Laptop, который представляет продукт, который мы собираем, и в качестве внутреннего класса мы определили Builder, который позаботится о создании продукта шаг за шагом. шаг. Builder реализует установщик для каждого поля, доступного в продукте, и предоставляет метод сборки для сборки продукта к концу.
В классе Builder мы определили некоторые значения по умолчанию на случай, если клиент не заинтересован в настройке всех полей самостоятельно.

#Jack configured his laptop in one session
jack_laptop = Laptop.Builder().set_cpu('i7').set_ram('16GB').set_storage("1TB")


#Mary configured her laptop in two sessions at different times
mary_laptop = Laptop.Builder().set_cpu('i9')
mary_laptop = mary_laptop.set_ram('32GB')


jack_laptop.build().to_string() #'Configurations are:  CPU: i7  RAM: 16GB  STORAGE: 1TB'
mary_laptop.build().to_string() #'Configurations are:  CPU: i9  RAM: 32GB  STORAGE: 128GB'

У нас есть два клиента; Джек и Мэри. Каждый настроил свой ноутбук по-разному и отправил объект Builder производителю, где будет вызван метод сборки для создания соответствующего объекта.

Еще одно преимущество, которое мы можем получить, используя Builder, — это возможность определять некоторые предварительно настроенные объекты и предоставлять их в качестве прототипов, которые клиент может использовать в качестве отправной точки.

gaming_laptop = Laptop.Builder().set_cpu('i9').set_ram('32GB').set_storage("1TB")
programing_laptop = Laptop.Builder().set_cpu('i7').set_ram('32GB').set_storage("256TB")
kid_laptop = Laptop.Builder().set_cpu('i3').set_ram('8GB').set_storage("256TB")

#Ahmed is configuring a gaming laptop
ahmed_laptop = gaming_laptop.set_storage("2TB")

Предложения: