Шаблон проектирования: Фабричный метод (примеры TypeScript)

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

Вот пример реализации на TypeScript:

// Product: Shape interface
interface Shape {
  draw(): void;
}

// Concrete Products
class Circle implements Shape {
  draw() {
    console.log("Drawing a circle.");
  }
}

class Square implements Shape {
  draw() {
    console.log("Drawing a square.");
  }
}

//Next, we'll create the Creator (Factory) interface and the Concrete Creators:

// Creator (Factory) interface
interface ShapeFactory {
  createShape(): Shape;
}

// Concrete Creators
class CircleFactory implements ShapeFactory {
  createShape() {
    return new Circle();
  }
}

class SquareFactory implements ShapeFactory {
  createShape() {
    return new Square();
  }
}

// Now, let's see how the client code (consumer) can use the Factory Method to create shapes without knowing their specific types:

function drawShape(factory: ShapeFactory) {
  const shape = factory.createShape();
  shape.draw();
}

// Client Code

drawShape(new CircleFactory());

drawShape(new SquareFactory());
Output:

Drawing a circle.
Drawing a square.

В этом примере мы реализовали шаблон проектирования Factory Method для создания различных фигур в TypeScript. Интерфейс ShapeFactory служит Создателем, а CircleFactory и SquareFactory являются Конкретными Создателями, ответственными за создание экземпляров Circle и Square соответственно. Клиентский код теперь может рисовать различные фигуры с помощью функции drawShape, не зная о конкретных типах фигур, создаваемых за кулисами. Это способствует ослаблению связи и упрощает добавление новых типов фигур в будущем без изменения клиентского кода.

Когда использовать шаблон проектирования Factory Method?

  • Создавайте объекты без указания их точных классов.
  • Иметь несколько связанных классов с общим интерфейсом.
  • Делегируйте создание объектов подклассам.
  • Централизованная логика создания.
  • Следуйте принципу открытого-закрытого.
  • Отделите клиентский код от конкретных классов.

Какие проблемы решить?

  1. Отвязка клиентского кода от конкретных классов. При использовании шаблона фабричных методов клиентскому коду не требуется знать конкретные классы, которые он создает. Вместо этого он полагается на фабричный метод для создания объектов, что способствует слабой связи и делает код более удобным для сопровождения и расширяемым.
  2. Централизованное создание объектов. Шаблон централизует логику создания объектов внутри фабричного метода или фабричного класса. Это гарантирует, что любые изменения или обновления процесса создания объекта ограничены одним местом, что упрощает управление и обслуживание.
  3. Поддержка принципа открытого-закрытого. Шаблон фабричного метода придерживается принципа открытого-закрытого, согласно которому программные объекты должны быть открыты для расширения, но закрыты для модификации. Новые типы продуктов могут быть введены путем создания новых подклассов конкретной фабрики без изменения существующего клиентского кода.
  4. Упрощенное обслуживание кода. За счет абстрагирования процесса создания объектов шаблон Factory Method уменьшает дублирование кода и способствует лучшей организации кода. Это также повышает удобочитаемость и упрощает задачи обслуживания.
  5. Включение внедрения зависимостей. Шаблон Factory Method упрощает внедрение зависимостей, позволяя клиентскому коду зависеть от интерфейса фабрики, а не от конкретных классов. Это упрощает переключение между различными реализациями или конфигурациями объектов.

В целом, шаблон проектирования Factory Method повышает гибкость, удобство сопровождения и масштабируемость кода, предоставляя структурированный подход к созданию объектов и способствуя абстракции и инкапсуляции.

Аналогия с реальным миром

Пиццерия

Представьте, что вы владелец пиццерии и предлагаете своим клиентам различные виды пиццы. Каждая пицца может иметь разные начинки, соусы и типы корочки. Чтобы эффективно управлять процессом создания пиццы, вы используете шаблон Factory Method.

В этой аналогии:

Товар: пицца

  • Это представляет собой иерархию классов продуктов с различными типами пиццы в качестве подклассов (например, «Маргарита», «Пепперони», «Вегетарианский», «Барбекю с курицей»).

Создатель: PizzaFactory

  • Это фабричный класс, который определяет фабричный метод «createPizza()», отвечающий за создание экземпляров различных типов пиццы на основе заказов клиентов.

Конкретные производители: MargheritaPizzaFactory, PepperoniPizzaFactory и т. д.

  • Это конкретные подклассы PizzaFactory, каждый из которых отвечает за создание определенного типа пиццы (например, MargheritaPizzaFactory создает пиццу Margherita).

Клиент: Клиент

  • Клиент представляет код клиента, который заказывает пиццу в пиццерии.

Используя паттерн Factory Method в этом сценарии, клиенту (заказчику) не нужно знать специфику создания пиццы. Вместо этого они взаимодействуют с PizzaFactory, чтобы разместить свои заказы. Фабричный метод внутри каждого конкретного класса-создателя обрабатывает создание желаемого типа пиццы.

Преимущества аналогии:

  • Процесс создания пиццы в ресторане-пиццерии централизован в PizzaFactory, что упрощает управление и модификацию при необходимости.
  • Клиент может запросить любой тип пиццы, который он хочет, не зная сложности создания пиццы.
  • Ресторан-пиццерия может вводить новые типы пиццы (подклассы) и настраивать процесс создания пиццы, не влияя на то, как клиенты размещают свои заказы.

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

Если вам нравится моя работа, пожалуйста:

1. Пожертвовать 💕💸

Оплата на сайте Revolut или используйте QR-код выше.

Ваше пожертвование подпитывает мое стремление продолжать создавать значимую работу. Спасибо! 🦁💚

2. Следуй за мной и подписывайся🤗

  • "Подписывайтесь на меня"
  • "Подписаться"
  • ЛинкедИн