Рубрики
Без рубрики

Уроки масонита – Использование заводской шаблона

Урок архитектуры масонита. Использование шаблона проектирования завода. Tagged с Python, Framework, DesignPatterns.

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

Я буду создавать эти статьи, в которых рассказывается о различных моделях дизайна и о том, как я ежедневно использую их в своих приложениях.

Паттерны дизайна довольно просты. Мы, как разработчики, сталкиваемся с проблемами с нашим кодом. У нас, разработчиков, есть 5 целей разработки программного обеспечения – это предоставление продукта то есть

  • вовремя
  • в пределах бюджета
  • без ошибок (без ошибок)
  • удовлетворяет потребности сейчас
  • удовлетворяет потребности в будущем

Мы, как разработчики, должны иметь возможность выполнять эти задачи таким образом, чтобы они могли удовлетворить потребности сейчас и в будущем. Это проблемы, с которыми сталкиваются разработчики все время. На протяжении многих лет разработчики сталкивались с одними и теми же проблемами снова и снова, и так же, как у плотника «уловки торговли», и разработчики. Эти трюки называются шаблонами проектирования программного обеспечения. Это просто решение проблем, с которыми мы сталкиваемся все время в нашей жизни развития.

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

Заводской шаблон используется для создания объекта во время выполнения. Вот и все. Это просто класс, который может возвращать различные типы объектов, зависящих от любого значения, передаваемого ему. Например, вы можете передать значение шоколад в ICECREAMFACTORY и вернуть ChocolateCream учебный класс.

Это может быть сделано во время выполнения, где этот шаблон вступает в игру. Значение шоколад может храниться в столбце базы данных, который извлекается для определенного пользователя, например.

class IceCreamFactory:

    flavors = {
        'chocolate': ChocolateIceCream,
        'vanilla': VanillaIceCream,
        'strawberry': StrawberryIceCream,
    }

    def make(self, flavor):
        return self.flavors[flavor]()

Вот и все. Мы только что создали завод, используя заводской шаблон. Теперь все, что нам нужно сделать, это указать нужный вкус, и мы можем вернуть правильный вкус:

flavor = IceCreamFactory().make('strawberry') #== 

Вот реальный пример мира того, как я использовал этот шаблон. Мы предоставляем сервер. Для простоты у нас есть 2 услуги, которые мы хотим предоставить:

  • Постгрес
  • Nginx

Теперь нам нужно предоставить обе эти услуги на 2 различных типах серверов:

  • Ubuntu
  • Дебюн

Теперь обратите внимание здесь, у нас есть несколько разных возможностей, которые мы можем выбрать:

  • Установка Postgres на Ubuntu
  • Начало Postgres на Ubuntu
  • Остановка Postgres на Ubuntu
  • Установка Nginx на Debian ….. так далее и так далее

Существует экспоненциальное количество возможностей, особенно когда мы добавляем новые серверы, новые услуги или добавляем между ними слои (например, установка через Docker вместо команд Bash).

Как решить эту проблему? Немного комбинация нескольких шаблонов, но мы сосредоточимся на фабрике для этой статьи.

Решение здесь состоит в том, чтобы использовать 2 фабрики.

Первая фабрика будет ServerFactory который будет отвечать за получение любого из нескольких серверов (Ubuntu, Debian, Centos, ..).

Вторая фабрика будет ServicesFactory который будет отвечать за получение любой из нескольких услуг (Postgres, Nginx, Rabbitmq, ..).

Серверная фабрика

Используя пластину котла выше, давайте продолжим и создадим нашем ServerFactory :

class ServerFactory:

    servers = {
        'ubuntu': UbuntuServer,
        'debian': DebianServer,
        'centos': CentosServer,
    }

    def make(self, server):
        return self.servers[server]()

Обратите внимание, что мы только что изменили ароматы мороженого для серверов (UNIX вкуса?).

Сервисная фабрика

Теперь давайте сделаем то же самое для услуг:

class ServiceFactory:

    services = {
        'postgres': PostgresService,
        'nginx': NginxService,
        'rabbitmq': RabbitMQService,
    }

    def make(self, service):
        return self.services[service]()

Обратите внимание, что весь этот код является той же котлом.

Объединяя фабрику

Теперь, если мы думаем об этом с точки зрения базы данных:

Сервер имеет много Сервисы

Верно? Поскольку сервер имеет много Услуги, давайте подмирим это. Давайте сделаем Ubuntuserver иметь доступ к ServiceFactory :

from app.factories import ServiceFactory

class UbuntuServer:

    services = ServiceFactory()

    def connect(self):
        self.establish_connection()
        return self

Бум Сделанный. Теперь наш Ubuntuserver имеет доступ ко всем нашим услугам.

Давайте продолжим и используем эти 2 фабрики в нашем приложении:

from app.factories import ServerFactory

def show(self):
  user = User.find(1)
  user.server #== 'ubuntu'

  server = ServerFactory().make(user.server) #== 
  server.connect()


  for service in ('postgres', 'nginx', 'rabbitmq'):
      server.services.make(service).install()

Паттерны дизайна полезны для решения проблем сейчас и в будущем. Этот шаблон полезен, потому что:

  • Поддержка большего количества серверов так же просто, как создание новых серверов.
  • Поддержка большего количества услуг так же просто, как и создание новых услуг.

Эти две вещи могут существовать отдельно друг от друга и, следовательно, могут быть масштабированы или вниз друг от друга.

Оригинал: “https://dev.to/masonite/masonite-lessons—using-the-factory-pattern-o6p”