Паттерн Строитель в Python: создание сложных объектов пошагово

Паттерн Строитель в Python: создание сложных объектов пошагово

В этой статье мы рассмотрим один из порождающих паттернов проектирования в языке 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_osset_cameraset_battery, и set_screen, чтобы задать значения для каждого из свойств. В конце мы вызвали метод get_phone, который вернул нам готовый объект

Заключение

Итак, в заключении можно с уверенностью сказать, что паттерн Строитель (Builder) является важным инструментом для пошагового создания сложных объектов. Благодаря этому паттерну клиент может создавать объекты, задавая только необходимые параметры, что значительно упрощает процесс разработки и избавляет от необходимости знать все возможные конфигурации объекта. В Python этот паттерн может быть использован для различных классов и объектов, улучшая их читаемость и расширяемость, а также упрощая тестирование кода.

Кроме того, использование паттерна Строитель позволяет разделить процесс создания сложных объектов на более мелкие этапы, что упрощает процесс тестирования и отладки программы.

Использование паттерна Строитель — это один из способов повысить качество кода и улучшить его структуру. Он может быть использован вместе с другими паттернами проектирования и является необходимым инструментом в арсенале каждого разработчика Python.

Егор Егоров

Программирую на Python с 2017 года. Люблю создавать контент, который помогает людям понять сложные вещи. Не представляю жизнь без непрерывного цикла обучения, спорта и чувства юмора.

Ссылка на мой github есть в шапке. Залетай.

Оцените автора
Егоров Егор
Добавить комментарий

  1. Den

    Не совсем разобрался, для чего это надо…
    Если сделать так:
    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 и т.д.

    Ответить
    1. Andrey

      Конечно можно поместить все операции строителя внутрь Phone и позволить каждому телефону «строить» самого себя.
      Но чем меньше класс Phone, тем проще в нём разобраться и внести изменения, а PhoneBuilder легко отделяет от Phone.
      Ещё важнее то, что разделение этих двух классов позволяет создать множество разновидностей «строителей телефона». Каждый наследник может вносить что-то своё и не тащить все ненужные методы.
      Паттерны — это не про новые возможности языка. Это скорее способы построения архитектуры, которую можно легко поддерживать и улучшать.

      Ответить