В этой статье мы рассмотрим один из порождающих паттернов проектирования в языке Python — паттерн Строитель.
Этот паттерн позволяет создавать сложные объекты пошагово, избавляя клиента от необходимости знать все возможные конфигурации и параметры объекта.
Мы рассмотрим пример применения паттерна Строитель на примере проектирования классов телефонов и пошагово создадим объект класса Phone с помощью класса PhoneBuilder. Ознакомившись с этой статьей, вы сможете использовать паттерн Строитель для создания сложных объектов в своих проектах на Python.
Введение
Паттерн Строитель (Builder) — это один из порождающих паттернов проектирования, который используется для создания сложных объектов, разделенных на несколько этапов. С помощью этого паттерна клиент может пошагово задавать параметры объекта, не заботясь о деталях реализации. Это помогает сделать код более читаемым, уменьшить количество ошибок и улучшить его расширяемость.
Пример
В качестве примера для объяснения паттерна Строитель на языке Python можно рассмотреть проектирование классов телефонов с использованием этого паттерна. Допустим, у нас есть класс Phone
, который имеет следующие свойства:
class Phone: def __init__(self): self.os = None self.camera = None self.battery = None self.screen = None
Класс Phone
имеет четыре свойства: os, camera, battery, и screen. Для каждого из этих свойств может быть выбрано одно из нескольких возможных значений. Например, для свойства os может быть выбрано одно из трех значений: «iOS», «Android», или «Windows». Для того, чтобы создать объект класса Phone
, необходимо задать значения для каждого из свойств.
Для более гибкого создания объектов класса Phone
в соответствии с требуемыми параметрами, мы можем использовать паттерн Строитель, который позволит нам разделить процесс создания объекта на несколько шагов. Для этого мы можем определить класс PhoneBuilder
, который будет предоставлять удобный интерфейс для задания значений каждого свойства объекта Phone, позволяя создавать объекты с теми параметрами, которые нам нужны.
class PhoneBuilder: def __init__(self): self.phone = Phone() def set_os(self, os): self.phone.os = os return self def set_camera(self, camera): self.phone.camera = camera return self def set_battery(self, battery): self.phone.battery = battery return self def set_screen(self, screen): self.phone.screen = screen return self def get_phone(self): return self.phone
В классе PhoneBuilder
мы определяем методы для пошагового задания значений каждого свойства объекта класса Phone. Каждый метод возвращает ссылку на объект self, что позволяет использовать цепочку вызовов методов. Когда все значения свойств заданы, мы вызываем метод get_phone, который возвращает объект класса Phone
со всеми заданными значениями.
Таким образом, класс PhoneBuilder предоставляет удобный и гибкий способ создания объектов класса Phone с нужными параметрами.
Для создания объекта класса Phone с помощью класса PhoneBuilder
необходимо выполнить следующий код:
builder = PhoneBuilder() phone = builder.set_os("Android").set_camera("12 MP").set_battery("3500 mAh").set_screen("6.2 inches").get_phone()
В данном примере мы создали объект builder класса PhoneBuilder, который позволяет нам пошагово задать значения для каждого из свойств объекта класса Phone. Затем мы вызвали методы set_os
, set_camera
, set_battery
, и set_screen
, чтобы задать значения для каждого из свойств. В конце мы вызвали метод get_phone
, который вернул нам готовый объект
Заключение
Итак, в заключении можно с уверенностью сказать, что паттерн Строитель (Builder) является важным инструментом для пошагового создания сложных объектов. Благодаря этому паттерну клиент может создавать объекты, задавая только необходимые параметры, что значительно упрощает процесс разработки и избавляет от необходимости знать все возможные конфигурации объекта. В Python этот паттерн может быть использован для различных классов и объектов, улучшая их читаемость и расширяемость, а также упрощая тестирование кода.
Кроме того, использование паттерна Строитель позволяет разделить процесс создания сложных объектов на более мелкие этапы, что упрощает процесс тестирования и отладки программы.
Использование паттерна Строитель — это один из способов повысить качество кода и улучшить его структуру. Он может быть использован вместе с другими паттернами проектирования и является необходимым инструментом в арсенале каждого разработчика Python.
Не совсем разобрался, для чего это надо…
Если сделать так:
class Phone:
def __init__(self):
self.os = None
self.camera = None
self.battery = None
self.screen = None
def set_os(self, os):
self.os = os
return self
def set_camera(self, camera):
self.camera = camera
return self
phone = Phone().set_os(‘Windows’).set_camera(‘8 Mpx’)
Смысл тогда создавать builder и т.д.
Конечно можно поместить все операции строителя внутрь Phone и позволить каждому телефону «строить» самого себя.
Но чем меньше класс Phone, тем проще в нём разобраться и внести изменения, а PhoneBuilder легко отделяет от Phone.
Ещё важнее то, что разделение этих двух классов позволяет создать множество разновидностей «строителей телефона». Каждый наследник может вносить что-то своё и не тащить все ненужные методы.
Паттерны — это не про новые возможности языка. Это скорее способы построения архитектуры, которую можно легко поддерживать и улучшать.