首页 > 解决方案 > 将工厂方法放在抽象父类中

问题描述

共有三种不同类型的ShapeRectangleCircleTriangle

这些形状共享一些放置在父级(形状)中的代码,并且有一种方法在这三个形状中实现不同:draw()

根据输入值,调用该方法的三个实现之一:

abstract class Shape {
    @Autowired
    private Rectangle rectangle;
    @Autowired
    private Circle circle;
    @Autowired
    private Triangle triangle;

    public String drawIt(ShapeEnum shape, String param1, String param2) {
        switch(shape) {
            case ShapeEnum.Rectangle:
                return rectangle.draw();
            case ShapeEnum.Circle:
                return circle.draw();
            case ShapeEnum.Triangle:
                return triangle.draw();
        }
    }
    protected int sharedMethod1() {//....}
    protected int sharedMethod2() { //...}
    protected abstract String draw();
}

@Controller
public class Controller {
    @Autowired
    private Shape shape;

    @RequestMapping(path = "", method = RequestMethod.POST) 
    public String getDrawing(@RequestBody GetShapeRequest shapeRequest) {
        return shape.drawIt(ShapeEnum.valueOf(shapeRequest), shapeRequest.getParam1(), shapeRequest.getParam2());
    }
}

显然这是行不通的,因为 Spring 无法实例化具有三个实现的抽象类。

我想知道是否有一种设计模式可以让父母在顶部决定要调用哪个孩子。我不喜欢将所有具体类连接到控制器中的想法,因为我希望父类控制流而不是控制器。

标签: javaspring-bootdesign-patterns

解决方案


您可以使用@Qualifier注解来指定implementation需要使用哪些。

@Autowired
@Qualifier("childShape")
private Shape shape;

推荐阅读