Java 工厂类应该是单例还是静态方法?
我创建了一个创建各种实例的类。它就像一个工厂。 据我所知,工厂类是singleton或CreateInstance作为静态方法。 但是我的课是spring原型范围。它有一个成员变量。还有一些方法必须调用sequence 在每次方法调用后设置成员变量 我想知道在这种情况下它是如何设计的。 你能推荐更好的方式或好的命名吗 我正在研究spring框架和Java8Java 工厂类应该是单例还是静态方法?,java,spring,design-patterns,naming,Java,Spring,Design Patterns,Naming,我创建了一个创建各种实例的类。它就像一个工厂。 据我所知,工厂类是singleton或CreateInstance作为静态方法。 但是我的课是spring原型范围。它有一个成员变量。还有一些方法必须调用sequence 在每次方法调用后设置成员变量 我想知道在这种情况下它是如何设计的。 你能推荐更好的方式或好的命名吗 我正在研究spring框架和Java8 @Component @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) pub
@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);
// ....
}
}
@组件
@范围(值=ConfigurableBeanFactory.Scope\u原型)
公共类果树{
私有字符串类型;
@塞特
私有整数字段;//设置alfter调用appleSupplier
公用果树(字符串类型){
Assert.notNull(类型);
this.type=type;
}
公共T创建(类clazz){
客观结果;
if(clazz==Apple.class){
结果=appleSupplier.get();
}else if(clazz==Banana.class){
结果=bananaSupplier.get();
}否则{
抛出新的IllegalArgumentException();
}
返回(T)结果;
}
私人供应商应用程序供应商=()->{
苹果=新苹果();
// ...
还苹果;
};
私人供应商bananaSupplier=()->{
香蕉香蕉=新香蕉();
香蕉。设置场(场);
还香蕉;
};
}
@服务
公共级水果服务{
@自动连线应用程序上下文上下文;
公共作废购买(字符串类型){
fruitfactory fruitfactory=context.getBean(fruitfactory.class,type);
Apple=foultefactory.create(Apple.class);
//拯救苹果
整数no=apple.getNo();
果园设置场(no);
香蕉香蕉=水果因子.create(Banana.class);
// ....
}
}
如果您真的需要从它们的类名创建水果(在一般情况下,我不会建议这样做),您应该只使用映射>
,然后使用class.cast
返回正确的类型
而且,如果你的工厂包含一个只用于制造苹果的字段,那听起来就大错特错了。无论苹果的供应商是什么,都必须将此字段括起来。工厂模式从未强制工厂成为一个单一的供应商。谢谢您的回答。实际上,“水果工厂”有更多的供应商(樱桃、甜瓜、桃子……)成员变量越多,它们之间的关联性就越大。所以你提出的Map不能使用它。你能为我建议具体的方法吗?例如,你拥有的供应商越多,Map的关联性就越大。在创建apple之后,设置field1的任何值。创建banana时,必须引用field1。其他供应商的情况相同它是否涵盖了这种情况?如果供应商是在实例化工厂时创建和注册的,那么它可以。我得到了它。你的意思是如果供应商增加了,那么创建方法有很多if语句。映射可以避免它。对吗?