фабричный дизайн шаблон проверки понимания - PullRequest
0 голосов
/ 07 октября 2018

Я хотел бы проверить правильность моего понимания.

Допустим, у меня есть класс Car и 2 подкласса SuperCar и ClassicCar.

Если я создаю метод для создания этих 2 подклассов вCarFactory, и я вызываю их следующим образом - CarFactory.make («super») для SuperCar и CarFactory.make («classic») для ClassicCar, я использую простую заводскую настройку, верно?

Если я хочуиспользуйте фабричный метод, который мне нужен, чтобы сделать CarFactory абстрактным / интерфейсом, который имеет метод make ().Тогда у меня должна быть другая фабрика, например DefaultCarFactory, например, для создания машины по умолчанию и переопределения метода make () и ModifyCarFactory для создания модифицированной машины, которая также переопределяет метод make (), и в этом случае оба метода по-прежнему возвращают тип, основанный на типе.по параметру, который я даю, "классический" или "супер"

Правильно ли мое понимание?

1 Ответ

0 голосов
/ 07 октября 2018

Не стоит полагаться на классические и супер дискриминаторы.

Взгляните на приведенные ниже фрагменты.

Иерархия вашего автомобиля:

public class Car {...}

public class ClassicCar extends Car() {...}

public class SuperCar extends Car() {...}

Определение фабрики:

public interface CarFactory {

    // it is imperative the return type here is `Car`
    Car getInstance();

}

Фабричные реализации:

public ClassicCarFactory implements CarFactory {

    @Override
    public Car getInstance() {
        return new ClassicCar();
    } 

}

public SuperCarFactory implements CarFactory {

    @Override
    public Car getInstance() {
        return new SuperCar();
    } 

}

Ваш код клиента:

public class CarClient {

    private CarFactory factory;

    // inject a ClassicCarFactory or a SuperCarFactory via constructor 
    public CarCient(CarFactory factory){
        this.factory = factory;
    }

    public void doSomethingWithCar() {
        // get either a ClassicCar or a SuperCar based on the concrete factory type
        Car car = factory.getInstance();
        ...
    }

} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...