Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 工厂类应该是单例还是静态方法?_Java_Spring_Design Patterns_Naming - Fatal编程技术网

Java 工厂类应该是单例还是静态方法?

Java 工厂类应该是单例还是静态方法?,java,spring,design-patterns,naming,Java,Spring,Design Patterns,Naming,我创建了一个创建各种实例的类。它就像一个工厂。 据我所知,工厂类是singleton或CreateInstance作为静态方法。 但是我的课是spring原型范围。它有一个成员变量。还有一些方法必须调用sequence 在每次方法调用后设置成员变量 我想知道在这种情况下它是如何设计的。 你能推荐更好的方式或好的命名吗 我正在研究spring框架和Java8 @Component @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) pub

我创建了一个创建各种实例的类。它就像一个工厂。 据我所知,工厂类是singleton或CreateInstance作为静态方法。 但是我的课是spring原型范围。它有一个成员变量。还有一些方法必须调用sequence 在每次方法调用后设置成员变量

我想知道在这种情况下它是如何设计的。 你能推荐更好的方式或好的命名吗

我正在研究spring框架和Java8

@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语句。映射可以避免它。对吗?