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 (должен быть получен извне).
Спасибо!
Ответы
Ответ 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. ИМХО.