我创建了一个创建各种实例的类。它就像一个工厂。 我知道工厂类是单例或创建实例作为静态方法。 但我的班级是春季原型范围。它有成员变量。也有方法必须调用序列 在每个方法调用之后设置成员变量。
我想在这种情况下知道它是如何设计的。 你能推荐更好的方式或更好的命名吗?
我正在研究spring框架和java 8 ..
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class FruiteFactory {
private String type;
@Setter
private Integer field; // set alfter call appleSupplier
public FruiteFactory(String type) {
Assert.notNull(type) ;
this .type = type ;
}
public < T> T create(Class<T > clazz) {
Object result;
if (clazz == Apple.class) {
result = appleSupplier.get();
} else if (clazz == Banana. class) {
result = bananaSupplier.get();
} else {
throw new IllegalArgumentException();
}
return (T ) result;
}
private Supplier<Apple> appleSupplier = () -> {
Apple apple = new Apple();
// ...
return apple;
};
private Supplier<Banana> bananaSupplier = () -> {
Banana banana = new Banana();
banana.setField(field);
return banana;
};
}
@Service
public class FruiteService {
@Autowired ApplicationContext context;
public void buy(String type) {
FruiteFactory fruiteFactory = context.getBean(FruiteFactory.class, type);
Apple apple = fruiteFactory.create(Apple.class);
// save the apple
Integer no = apple.getNo();
fruiteFactory.setField(no);
Banana banana = fruiteFactory.create(Banana.class);
// ....
}
}
答案 0 :(得分:3)
如果你真的需要从他们的类名创建水果(在一般情况下我不建议),你应该使用Map<Class<?>, Supplier<?>>
然后使用Class.cast
返回正确的类型。
此外,您的工厂包含仅用于创建苹果的字段,这听起来非常错误。这个字段绝对应该包含在Supplier
个苹果中。