将工厂方法放在抽象父类中

时间:2018-07-06 16:11:45

标签: java spring-boot design-patterns

有三种不同类型的 Shape 矩形圆形三角形

这些形状共享一些放置在父对象(Shape)中的代码,并且在这三个形状之间实现不同的一种方法: 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无法实例化具有三个实现的抽象类。

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

1 个答案:

答案 0 :(得分:0)

您可以使用@Qualifier注释来指定需要使用哪个implementation

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