当具体对象采用不同的构造函数参数时,Java 中的工厂

新手上路,请多包涵

我正在尝试用 Java 实现工厂模式。我有一个名为 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);
        }
    }

任何想法如何克服这个问题?我不能收到工厂内部用户的输入(必须从外部收到)。

谢谢!

原文由 Jjang 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 383
2 个回答

你有两个选择:

1) 抽象工厂

RectangularShape extends Shape

RoundShape extends Shape

RectangularShapeFactoryRoundShapeFactory

  1. 生成器(另请参阅 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();

原文由 Random42 发布,翻译遵循 CC BY-SA 3.0 许可协议

你想做的事根本不可能。如果构造函数参数不同,那么客户端代码将不得不为 Circle Square 和 --- 做不同的工作,你不能用统一的代码解决这个问题。如果工厂除了处理您认为应该在工厂中发生的构造函数参数之外还有其他工作要做,那么您需要将其发布到您的问题中并说明您在分解此常见代码工作时遇到的困难。

原文由 djechlin 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题