Jja*_*ang 48 java design-patterns factory
我正在尝试用Java实现Factory模式.我有一个名为Shape的类,Circle和Triangle扩展.问题是Shape构造函数只获得2个参数,而Circle获得3个参数,因此Triangle(我不会在代码部分显示,因为它与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);
}
}
Run Code Online (Sandbox Code Playgroud)
任何想法如何克服这个问题?我不得在工厂内收到用户的意见(必须从外面收到).
谢谢!
m3t*_*man 33
您有两种选择:
1)抽象工厂:
RectangularShape extends Shape
RoundShape extends Shape
并RectangularShapeFactory与RoundShapeFactory
2)Builder(参见Effective Java中的第2项)
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();
Run Code Online (Sandbox Code Playgroud)
你想要做的事情根本不可能.如果构造函数的参数是不同的,那么客户端代码将不得不做了不同的工作Circle,作为一个Square和你不能用统一的代码解决这个问题.如果除了处理您认为应该在工厂中发生的构造函数参数之外,工厂还在做其他工作,那么您需要将此问题发布到您的问题中,并说明您在分解此常见代码工作时遇到的困难.
您的所有实现必须使用相同数量的参数,您有三个选项: