Подтвердить что ты не робот

Factory в Java, когда конкретные объекты принимают разные параметры конструктора

Я пытаюсь реализовать шаблон Factory в Java. У меня есть класс под названием "Форма", круг которого и "Треугольник" продолжается. Проблема заключается в том, что конструктор Shape получает только 2 параметра, в то время как Circle получает 3 параметра, а также Треугольник (который я не буду показывать в разделе кода, потому что он идентичен Circle). Чтобы продемонстрировать это лучше:

    private interface ShapeFactory{
        public Shape create(int x, int y);
    }

    private class CircleFactory implements ShapeFactory{
        public Shape create(float radius, int x, int y){ //error
            return new Circle(radius, x,y);
        }
    }

Есть идеи, как преодолеть эту проблему? Я не должен получать данные от пользователя внутри Factory (должен быть получен извне).

Спасибо!

4b9b3361

Ответ 1

У вас есть два варианта:

1) Аннотация Factory:

RectangularShape extends Shape

RoundShape extends Shape

и RectangularShapeFactory и RoundShapeFactory

2) Builder (см. также пункт 2 в Эффективной Java)

public Shape {
    private final int x;
    private final int y;
    private final double radius;

    private Shape(Builder builder) {
        x = builder.x;
        y = builder.y;
        radius = builder.radius;
    }

    public static class Builder {
        private final int x;
        private final int y;
        private double radius;

        public Builder(int x, int y) {
            this.x = x;
            this.y = y;
        }

        public Builder radius(double radius) {
            this.radius = radius;
            return this;
        }

        public Shape build() {
            return new Shape(this);
        }    
    }
}

//in client code 

    Shape rectangle = new Shape.Builder(x,y).build();
    Shape circle = new Shape.Builder(x,y).radius(radiusValue).build();

Ответ 2

То, что вы пытаетесь сделать, просто невозможно. Если аргументы конструктора различны, тогда код клиента должен будет выполнить другую работу для Circle как для Square, и вы не можете решить эту проблему с помощью единого кода. Если есть другая работа, выполняемая factory, помимо обработки аргументов конструктора, которые, по вашему мнению, должны произойти в factory, тогда вам нужно опубликовать это на свой вопрос и указать сложность, с которой вы сталкиваетесь при факторизации этого общего кода, работа.

Ответ 3

все ваши реализации должны принимать одинаковое количество аргументов. у вас есть варианты

  • сохраните аргументы добавления factory, поэтому вам нужно только предоставить центр, например.
  • пусть factory принимает все аргументы, даже если некоторые заводы могут игнорировать некоторые из них.
  • имеет аргумент переменной длины. например "double..." проблема заключается в том, что вызывающий должен знать, что нужно для factory, которое побеждает цель factory. ИМХО.