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

👷 ♂ ️ / Декодировать Заводской шаблон / 🏭

Когда использовать, чтобы избежать работы с несогласованным объектом, когда объект необходимо создать… С пометкой дизайн, архитектура, java, шаблон дизайна.

Когда использовать

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

Намерение

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

Компоненты

  1. Интерфейс (или) Абстрактный класс (общедоступный)
  2. Набор подклассов реализации (частный)
  3. Фабричный метод (общедоступный)

Структура

Реализация

1 Создайте интерфейс. Клиенты могут писать код для этого интерфейса, не беспокоясь о внутренней реализации..

package com.gaurav.factorymethod;

public interface Vehicle {
  void design();
  void manufacture();
}

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

package com.gaurav.factorymethod;

public class Car implements Vehicle {

  Car() {
    /* constructor is protected.
       clients need to use the factory method */
  }

  @Override
  public void design() {
    System.out.println("Designing Car");
  }

  @Override
  public void manufacture() {
    System.out.println("Manufacturing Car");
  }

}

package com.gaurav.factorymethod;

public class Truck implements Vehicle {

  Truck() {
    /* constructor is protected.
       clients need to use the factory method */
  }

  @Override
  public void design() {
    System.out.println("Designing Truck");
  }

  @Override
  public void manufacture() {
    System.out.println("Manufacturing Truck");
  }

}
package com.gaurav.factorymethod;

public class Motorcycle implements Vehicle {

  Motorcycle() {
    /* constructor is protected.
       clients need to use the factory method */
  }

  @Override
  public void design() {
    System.out.println("Designing Motorcycle");
  }

  @Override
  public void manufacture() {
    System.out.println("Manufacturing Motorcycle");
  }

}

3 Создайте класс с методом “получить транспортное средство()”. Клиенты могут использовать этот метод для создания объекта вместо использования оператора “создать”.

package com.gaurav.factorymethod;

public class VehicleFactory {

  /* This is the factory method exposed to the client.
     Client requests for an object by passing the type.
     Client does not need to know about which & how object
     is created internally.
     */
  public Vehicle getVehicle(String vehicleType)
      throws VehicleTypeNotFoundException {

    if (vehicleType == null) {
      return null;
    }

    Vehicle vehicle = null;

    switch (vehicleType) {
      case "car":
        vehicle = new Car();
        break;
      case "truck":
        vehicle = new Truck();
        break;
      case "motorcycle":
        vehicle = new Motorcycle();
        break;
      default:
        throw new VehicleTypeNotFoundException();
    }

    return vehicle;
  }

}

4 Код клиента. Клиент знает только заводской метод и интерфейс. Клиентский код не использует “новый”, следовательно, отделен от реализации.

package com.gaurav.client;

import java.util.Scanner;

import com.gaurav.factorymethod.Vehicle;
import com.gaurav.factorymethod.VehicleFactory;
import com.gaurav.factorymethod.VehicleTypeNotFoundException;

public class FactoryMethodClient {

  public static void main(String[] args) {

    Scanner in = new Scanner(System.in);
    String vehicleType = in.nextLine().toLowerCase();

    /* Create a factory instance */
    VehicleFactory factory = new VehicleFactory();

    try {

      /* Create an appropriate vehicle based on the input */
      Vehicle vehicle = factory.getVehicle(vehicleType);

      /* Design and manufacture the vehicle */
      vehicle.design();
      vehicle.manufacture();

    } catch (VehicleTypeNotFoundException e) {
      System.out.println("Invalid vehicle type entered!");
    }

    in.close();
  }

}

Выход

[input1]
    MotorCycle
[output1]
    Designing Motorcycle
    Manufacturing Motorcycle

[input2]
    Car
[output2]
    Designing Car
    Manufacturing Car

[input3]
    Bus
[output3]
    Invalid vehicle type entered!

Выгоды

  • Ослабленное соединение позволяет изменять внутренние компоненты, не влияя на код заказчика
  • Заводской метод обеспечивает единую точку контроля для нескольких продуктов
  • Количеством экземпляров и возможностью их повторного использования можно управлять с помощью однотонального или многотонального

Недостатки

Дополнительный уровень абстракции делает код более трудным для чтения.

Примеры из Реального Мира

Аренда Транспортных Средств. Клиенту необходимо указать только тип транспортного средства (легковой автомобиль, грузовик и т.д.) это необходимо. Клиенту не нужно знать о внутренних деталях транспортного средства.

Пример программного обеспечения

  • Кэш памяти
  • Файловый кэш
  • Код для стандарта SQL, не беспокоясь о базовой БД

Примеры Java SDK

java.утилита. Calendar.getInstance() java.утилита. ResourceBundle.getBundle() java.текст. Числовой формат.getInstance() java.nio.набор символов. Кодировка.для имени() java.утилита.EnumSet.of() javax.xml.привязка. JAXBContext.createMarshaller()

Разница между абстрактной фабрикой и фабричным шаблоном?

TS;МИСТЕР: Абстрактная фабрика – это набор фабричных методов.

TL; DR: С фабричным шаблоном вы создаете экземпляры реализаций (Яблоко, банан, Вишня и т. Д.) Определенного интерфейса – скажем, iFruit.

С помощью шаблона Абстрактной фабрики вы предоставляете любому возможность создать свою собственную фабрику. Это позволяет вашему складу быть либо фабрикой I Fruit, либо любой фабрикой соков, не требуя, чтобы ваш склад что-либо знал о фруктах или соках.

Надеюсь, вам это понравится. Хотелось бы услышать ваши мысли об этом шаблоне дизайна.

Хотите обсудить больше Давайте выпьем кофе

Оригинал: “https://dev.to/gauravratnawat/decode-factory-pattern-245m”