如何从单例生成原型对象? (需要设计帮助) [英] How to Produce prototype objects from singleton? (Design help needed)

查看:120
本文介绍了如何从单例生成原型对象? (需要设计帮助)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是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;

Vehicle vehicle = vehicleBuilderFactory.getBuilder(platform).build();

My vehicleBuilderFactory looks like this;

@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;
    }
}

}

which itself looks pretty horrible. Each individual builder looks like;

@Service
public class DefenderBuilder implements VehicleBuilder {

@Autowired
Defender defender;

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

}

and finally the individual vehicle

@Service
@Scope("prototype")
public class Defender extends 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:

@Component
class DefenderBuilder implement VechicleBuilder {

  @Autowired
  ObjectFactory<Defender> defenderFactory;

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

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

}

This returns a new Defender on each call to defenderFactory.getObject()

这篇关于如何从单例生成原型对象? (需要设计帮助)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆