【问题标题】:Factory class should be singleton or static method?工厂类应该是单例还是静态方法?
【发布时间】:2016-07-31 01:42:28
【问题描述】:

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

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

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

    }
}

【问题讨论】:

  • 工厂模式从不强制工厂为单例

标签: java spring design-patterns naming


【解决方案1】:

如果你真的需要从它们的类名创建水果(在一般情况下我不建议这样做),你应该使用 Map&lt;Class&lt;?&gt;, Supplier&lt;?&gt;&gt; 然后使用 Class.cast 来返回正确的类型。

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

【讨论】:

  • 感谢您的回答。实际上“FruitFactory”有更多的供应商(樱桃,甜瓜,桃子......)和更多的成员变量它们相互关联。所以你提出的地图不能使用它。你能给我建议具体的方式吗?跨度>
  • 供应商越多,地图的相关性就越高
  • 例如。创建苹果后将 field1 设置为任何值。并且在创建香蕉时必须引用 field1。其他供应商也有同样的情况,是否涵盖这种情况?
  • 可以,如果在实例化工厂时创建并注册了供应商
  • 我明白了。你的意思是如果供应商增加了,那么 create 方法有很多 if 语句。地图能够避免它。对吗?
猜你喜欢
  • 1970-01-01
  • 2015-11-25
  • 1970-01-01
  • 2012-06-17
  • 2013-04-22
  • 1970-01-01
  • 2010-10-30
  • 2014-05-24
相关资源
最近更新 更多