2016-07-31 104 views
1

我做了一个创建各种实例的类。它就像一个工厂。 因为我知道工厂类是单例或创建实例作为静态方法。 但我的课是春天的原型范围。它有成员变量。也有方法调用每个方法后调用序列 集成员变量。工厂类应该是单例还是静态方法?

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

我工作的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

工厂模式从不强制工厂成为单身人士 – Dici

回答

3

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

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

+0

谢谢您的回答。 其实“FruiteFactory”有更多的供应商(樱桃,甜瓜,桃子......)和更多的成员变量他们是相互关联的,所以你提出的地图不能使用它,你可以给我建议具体的任何方式吗? – dalgoon

+0

您将拥有更多的供应商,更相关的将是地图 – Dici

+0

例如 创建苹果后设置field1任何值 当创建香蕉必须引用field1 其他供应商是相同的情况是否涵盖这种情况? – dalgoon

相关问题