2016-07-31 64 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

相關問題