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

2024-02-28

我正在尝试用 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);
        }
    }

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

Thanks!


您有两个选择:

1) 抽象工厂 http://en.wikipedia.org/wiki/Abstract_factory:

RectangularShape extends Shape

RoundShape extends Shape

and RectangularShapeFactory and RoundShapeFactory

2) Builder http://en.wikipedia.org/wiki/Builder_pattern(另请参阅《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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐