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

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

RectangularShapeFactoryRoundShapeFactory

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)

  • 抽象工厂无法解决这个问题.所有`ShapeFactory`实现仍然需要一个通用接口. (8认同)

dje*_*lin 8

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


Pet*_*rey 7

您的所有实现必须使用相同数量的参数,您有三个选项:

  • 让工厂存储附加参数,因此您只需要提供中心作为示例.
  • 尽管有些工厂可能会忽略其中一些工厂,但工厂仍会接受所有论点.
  • 有一个参数是可变长度.例如'double ...'这个问题是调用者需要知道工厂需要什么,这会破坏工厂的目的.恕我直言.