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

时间:2016-07-31 01:42:29

标签: java spring design-patterns naming

我创建了一个创建各种实例的类。它就像一个工厂。 我知道工厂类是单例或创建实例作为静态方法。 但我的班级是春季原型范围。它有成员变量。也有方法必须调用序列 在每个方法调用之后设置成员变量。

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

我正在研究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);
        // ....

    }
}

1 个答案:

答案 0 :(得分:3)

如果你真的需要从他们的类名创建水果(在一般情况下我不建议),你应该使用Map<Class<?>, Supplier<?>>然后使用Class.cast返回正确的类型。

此外,您的工厂包含仅用于创建苹果的字段,这听起来非常错误。这个字段绝对应该包含在Supplier个苹果中。