如何从singleton生成原型对象?(需要设计帮助)

use*_*087 10 spring scope design-patterns

我对Spring比较陌生,我自己也挖了个洞.我正在试图塑造汽车.每个模型都有自己的构建器对象,我有一个BuilderFactory,它根据用户从web-app中选择返回正确的构建器.

因此,我正在寻找有关如何解决这个问题的建议,我需要创建一些单独的车辆,但我不知道在运行时我需要什么类型的车辆,并且每辆车都需要对用户来说是独一无二的

我现在得到的内容如下所示.我现在面临的问题是,因为个别建筑商都是单身人士,所以个别车辆也是如此.我需要它们作为原型.我知道这一切看起来都非常糟糕,所以我相信一定有更好的办法.

网络应用程序的顶级看起来像;

Vehicle vehicle = vehicleBuilderFactory.getBuilder(platform).build();
Run Code Online (Sandbox Code Playgroud)

我的vehicleBuilderFactory看起来像这样;

@Service
public class VehicleBuilderFactory {

@Autowired
Discovery3Builder discovery3Builder;
@Autowired
Discovery4Builder discovery4Builder;

    // Lots of @Autowired statements here. 

@Autowired
FreeLander2010Builder freeLander2010Builder;



public VehicleBuilder getBuilder(Platform platform) {

    switch (platform.getId()) {

    case 1: return discovery3Builder;
    case 2: return discovery4Builder;

            // Lots of case statements here

            case 44: return freeLander2010Builder;
    default: return null;
    }
}

}
Run Code Online (Sandbox Code Playgroud)

这本身看起来很可怕.每个建筑师看起来像;

@Service
public class DefenderBuilder implements VehicleBuilder {

@Autowired
Defender defender;

// Loads of Defender specific setters ommitted  
@Override
public Vehicle build() {
    return defender;
}

}
Run Code Online (Sandbox Code Playgroud)

最后是个别车辆

@Service
@Scope("prototype")
public class Defender extends Vehicle {

}
Run Code Online (Sandbox Code Playgroud)

现在的主要问题是因为建造者是单身人士,车辆也是如此,我需要他们作为原型,因为用户A的后卫与用户B的后卫不同.

Fil*_*Fil 14

您可以使用Spring的ObjectFactory让它从单例作用域bean中提供原型作用域bean.用法非常简单:

@Component
class DefenderBuilder implement VechicleBuilder {

  @Autowired
  ObjectFactory<Defender> defenderFactory;

  Defender build() {
     return defenderFactory.getObject()
  }
}

@Component
@Scope("prototype")
class Defender {

}
Run Code Online (Sandbox Code Playgroud)

每次调用defenderFactory.getObject()时都会返回一个新的Defender