为使用工厂方法创建的对象生成唯一ID

问题描述 投票:0回答:2

我希望为使用工厂方法创建的所有对象实现 ID 生成器,并为使用构造函数创建的所有其他对象分配“0”值。下面的代码中我缺少什么?

public abstract class Figure {

    private static int counter = 0;

    private int number;

    public abstract double calculateArea();

    public abstract double calculatePerimeter();


    public Figure() {
    }

    public static Square createSquare(double a) {
        return new Square(a);
    }

    public static Circle createCircle(double r) {
        return new Circle(r);
    }

    public static Rectangle createRectangle(double a, double b) {
        return new Rectangle(a, b);
    }

    public static int getCounter() {
        return counter;
    }

    public static void setCounter(int counter) {
        Figure.counter = counter;
    }

    public int getNumber() {
        return number = ++Figure.counter;
    }


    @Override
    public String toString() {
        return super.toString();
    }
}
java object counter factory-method
2个回答
1
投票

您应该在静态方法调用中设置number

public static Rectangle createRectangle(double a, double b) {
  Figure fg = new Rectangle(a, b);
  fg.number = ++counter;
  return fg;
}

public int getNumber() {
  return number;
}

1
投票

首先,删除 setCounter 方法,因为它将更改类的私有状态。

其次,getNumber方法应该只返回this.number。目前,每当调用该方法时,您的号码都会增加。

第三,将值赋给Figure构造函数中的数字:

this.number = ++counter;

我认为 Square、Circle 和 Rectangle 扩展了 Figure,因此它们将调用超级构造函数并获取它们的数字集。

此外,如果我们谈论工厂设计模式,最好有一个单独的类来生成对象。

© www.soinside.com 2019 - 2024. All rights reserved.