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

Шаблон Заводского дизайна

Что это? Фабричный метод – это шаблон творческого проектирования, который определяет интерфейс или абстрактный класс… Помечено ооп, java, дизайн программного обеспечения, архитектура.

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

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

Решение Шаблон фабричного метода предполагает, что вместо непосредственного создания объектов (с помощью оператора new) мы используем фабричный метод, который создает объект для нас. В нашем случае вместо создания нового объекта car мы позволяем заводскому методу создавать объект для нас и возвращать нужный нам объект автомобиль/велосипед

Диаграмма классов:

Пример:

class Factory {
    public static void main(String[] args) {

        Transport t1 = CabService.getInstance().getCab("CAR");
        System.out.println(t1.getRate());

        Transport t2 = CabService.getInstance().getCab("BIKE");
        System.out.println(t2.getRate());

    }
}

class CabService{
    private static CabService onlyInstance;

    // Make the constructor private so its only accessible to
    // members of the class.
    private CabService() {
    }


    // Create a static method for object creation
    synchronized public static CabService getInstance() {

        if (onlyInstance == null) {
            // Only instantiate the object when needed.
            synchronized (CabService.class) {
                if (onlyInstance == null) {
                    onlyInstance = new CabService();
                }
            }
        }
        return onlyInstance;
    }

    public Transport getCab(String type) {
        return new CabFactory().getTransport(type);
    }
}

class CabFactory {

    //Factory method that returns transport based on type requested
    public Transport getTransport(String type) {
        switch(type) {
            case "CAR" :
                return new Car();
            case "BIKE" :
                return new Bike();
            default:
                return null;
        }
    }
}

//Transport abstract class
abstract class Transport {
    double rate = 0;
    public double getRate() {
        return rate;
    }
}

class Car extends Transport {
    double rate = 10;
    public double getRate() {
        return rate;
    }
}

class Bike extends Transport  {
    double rate = 5;
    public double getRate() {
        return rate;
    }
}

Обычаи:

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

Преимущества:

  • Шаблон фабричного метода позволяет подклассам выбирать тип создаваемых объектов
  • Это способствует ослаблению связи, устраняя необходимость привязки классов, специфичных для конкретного приложения, к коду
  • Принцип Единой Ответственности
  • Принцип Открытия/Закрытия

недостатки:

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

Ссылка на репозиторий Github: Шаблон заводского дизайна Github

Оригинал: “https://dev.to/amrindersinghdev/factory-design-pattern-3pah”