如何从单例生成原型对象? (需要设计帮助) [英] How to Produce prototype objects from singleton? (Design help needed)
问题描述
我是Spring的新手,我陷入了困境.我正在尝试为汽车建模.每个模型都有其自己的构建器对象,而我有一个BuilderFactory,它根据用户从Web应用程序中的选择返回正确的构建器.
因此,我正在寻找有关如何解决此问题的建议,该问题需要我创建一些单独的车辆,但是我不知道在运行时需要哪种类型的车辆,每辆车辆必须对用户而言是唯一的.
下面显示了我目前所拥有的.我目前的问题是,因为个体建造者是单身人士,个体车辆也是如此.我需要他们 成为原型.我知道这一切看起来都非常可怕,所以我敢肯定必须有更好的方法来做到这一点.
Web应用程序的顶级外观如下;
Vehicle vehicle = vehicleBuilderFactory.getBuilder(platform).build();
我的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;
}
}
}
本身看起来很恐怖.每个单独的生成器看起来都一样;
@Service
public class DefenderBuilder implements VehicleBuilder {
@Autowired
Defender defender;
// Loads of Defender specific setters ommitted
@Override
public Vehicle build() {
return defender;
}
}
最后是单个车辆
@Service
@Scope("prototype")
public class Defender extends Vehicle {
}
现在的主要问题是,因为建造者是单身人士,所以车辆也是,并且 我需要将它们作为原型,因为用户A的Defender与用户B的Defender不同.
您可以使用Spring的 这将在每次对DefenderFactory.getObject()的调用时返回一个新的Defender. I'm relatively new to Spring and I've got myself dug in a hole. I'm trying to model motor cars. Each model has it's own builder object, and I have a BuilderFactory that returns the correct builder based upon user selection from a web-app. So I'm looking for suggestions on how to approach this problem where I need to create a number of individual vehicles, but I don't know what type of vehicle I'm going to need until run-time, and each vehicle needs to be unique to the user. What I've got at the moment is shown below. The problem I have at the moment is that because the individual builders are singletons so are the individual vehicles. I need them
to be prototypes. I know it all looks pretty horrible so I'm sure there must be a better way of doing this. The top level from the web-app looks like; My vehicleBuilderFactory looks like this; which itself looks pretty horrible. Each individual builder looks like; and finally the individual vehicle The main problem now, is that because the builders are singletons, so are the vehicles, and
I need them to be prototypes, because User A's Defender is different to user B's Defender. You can use Spring's ObjectFactory to have it service up prototype scoped beans from a singleton scoped bean. The usage is pretty straightforward: This returns a new Defender on each call to defenderFactory.getObject() 这篇关于如何从单例生成原型对象? (需要设计帮助)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!Vehicle vehicle = vehicleBuilderFactory.getBuilder(platform).build();
@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;
}
}
}
@Service
public class DefenderBuilder implements VehicleBuilder {
@Autowired
Defender defender;
// Loads of Defender specific setters ommitted
@Override
public Vehicle build() {
return defender;
}
}
@Service
@Scope("prototype")
public class Defender extends Vehicle {
}
@Component
class DefenderBuilder implement VechicleBuilder {
@Autowired
ObjectFactory<Defender> defenderFactory;
Defender build() {
return defenderFactory.getObject()
}
}
@Component
@Scope("prototype")
class Defender {
}