gpt4 book ai didi

java - 如何在工厂方法中初始化具有多个参数构造函数的类

转载 作者:行者123 更新时间:2023-11-30 05:28:31 25 4
gpt4 key购买 nike

假设我有一个计算形状面积的 Shape 接口(interface)。我添加了 2 个实现矩形和正方形。我看到的挑战是两种实现都有自己的多参数构造函数。如何使用工厂模式初始化它们。我想用java来解决这个问题。

public class Rectangle implements Shape {
int length;
int breadth;

public Rectangle(List<String> parameters) {
this.length = Integer.parseInt(parameters.get(0));
this.breadth = Integer.parseInt(parameters.get(1));
}

@Override
public int area() {
return length * breadth;
}

}

public class Square implements Shape {
int edge;

public Square(List<String> parameters) {
this.edge = Integer.parseInt(parameters.get(0));
}

@Override
public int area() {

return edge * edge;
}

}

public interface Shape {
int area();

}

public interface ShapeFactory {
public Shape make(String shapeType);
public List<String> getParameters(String shapeType);

}

public class ShapeFactoryImpl implements ShapeFactory {
Map<String, List<String>> shapeInitMap = new HashMap<>();

public void init(){
shapeInitMap.put("Circle", Arrays.asList(new String[]{"4"}));
shapeInitMap.put("Rectangle", Arrays.asList(new String[]{"2","3"}));
}

@Override
public Shape make(String shapeType) {
switch (shapeType) {
case "Circle":
return new Square(getParameters(shapeType));
case "Square":
return new Rectangle(getParameters(shapeType));
default:
break;
}
return null;
}

@Override
public List<String> getParameters(String shapeType) {

return shapeInitMap.get(shapeType);
}

}

最佳答案

您的解决方案不是最佳的,因为:1)您必须为具体的Shape创建专用的构造函数,并且您会失去参数的类型检查(在编译时)。 2)具体工厂的init方法容易出错。

这就是我要做的。具体工厂应该携带具体 Shape 构造函数的参数,但不能作为不确定的字符串(如果从用户输入获取字符串,请在创建具体工厂之前转换它们):

public interface ShapeFactory {
public Shape make(String shapeType);
}

public class ShapeFactoryImpl implements ShapeFactory {
private int circleRadius;
private int rectangleLength;
private int rectangleBreadth;

public ShapeFactoryImpl(int circleRadius, int rectangleLength, int rectangleBreadth){
this.circleRadius = circleRadius;
this.rectangleLength = rectangleLength;
this.rectangleBreadth = rectangleBreadth;
}

public Shape make(String shapeType) {
switch (shapeType) {
case "Circle": return new Circle(this.circleRadius);
case "Rectangle": return new Rectangle(this.rectangleLength, this.rectangleBreadth);
default: throw new Exception("...");
}
}
}

客户端不需要知道他正在使用的具体ShapeFactory,也不必担心他获得的具体Shape。依赖关系是相反的:发挥关键作用的是抽象,而不是细节。但如果可能的形状数量增加,您将得到一个具有许多相似参数的构造函数。这是另一个解决方案:

public class ShapeFactoryImpl implements ShapeFactory {
private Shape circle;
private Shape rectangle;

public ShapeFactoryImpl(Circle circle, Rectangle rectangle){
this.circle = circle;
this.rectangle = rectangle;
}

public Shape make(String shapeType) {
switch (shapeType) {
case "Circle": return this.circle.clone();
case "Rectangle": return this.rectangle.clone();
default: throw new Exception("...");
}
}
}

这更好,因为您不会混合参数:每个具体的 Shape 都包含自己的参数。如果你想让它更灵活,你可以使用 Map 将交换机的责任移出具体工厂:

public class ShapeFactoryImpl implements ShapeFactory {
private Map<String, Shape> shapeByType;

public ShapeFactoryImpl(Map<String, Shape> shapeByType){
this.shapeByType = shapeByType;
}

public Shape make(String shapeType) {
Shape shape = this.shapeByType.get(Type).clone();
if (shape == null) {
throw new Exception("...");
}
return shape;
}
}

我什至会使用 enum 作为形状类型而不是字符串,并使用 EnumMap 来处理切换:

public class ShapeFactoryImpl implements ShapeFactory {
private EnumMap<ShapeType, Shape> shapeByType;

public ShapeFactoryImpl(Map<ShapeType, Shape> shapeByType){
this.shapeByType = shapeByType;
}

public Shape make(ShapeType shapeType) {
return this.shapeByType.get(Type).clone();
}
}

客户端必须知道 ShapeShapeFactory 接口(interface)以及 ShapeType 枚举。 “服务器”提供具体的 ShapeFactoryImpl 实例。

关于java - 如何在工厂方法中初始化具有多个参数构造函数的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58032344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com