2013-02-12 49 views
4

我一直在尋找很多地方實例化類,但我沒有找到我的問題一個很好的答案:很好的做法,從一個枚舉值

我有一個枚舉,例如:

public enum Window { CLASSIC, MODERN } 

,我需要分開我的應用程序的行爲根據枚舉值,這樣的:

switch (myWindow.getType()) { 
    case CLASSIC: new ClassicWindow(...); 
    case MODERN: new ModernWindow(...); 
} 

我知道你在想什麼:簡單地說,在枚舉和BASTA,但是這不是唯一的類根據在我的枚舉!而且我無法編寫儘可能多的對象創建方法,因爲我擁有對象!

簡而言之,在這種情況下我能做些什麼?我的一個朋友告訴我要每次都去掉枚舉並使用派生類,但最後我必須爲所有測試創建與子類一樣多的實例!

總之,我卡住了。

您知道最佳實踐嗎?謝謝

+3

[摘要工廠模式](http://en.wikipedia.org/wiki/Abstract_factory_pattern) – 2013-02-12 13:58:37

回答

0

您似乎在尋找design pattern,而不是使用枚舉的最佳實踐。您打算編寫的代碼將充滿switch語句,對於enum的每個可能值都有一個條件 - 從長遠來看很難維護和擴展。一個更好的想法是重構每個可能的案例在一個單獨的類中的行爲,可能使用Abstract Factory模式。

+0

其實抽象工廠模式可以是我要找的...在抽象的我會有工廠方法爲每個元素:一個用於窗戶,一個用於皮膚... – KayZee 2013-02-12 14:07:27

+0

非常感謝,我沒有想到這個,我覺得很愚蠢:/ – KayZee 2013-02-12 14:19:21

0

這是工廠模式。 This example實際上顯示了你正在做的事情。

+1

我知道Factory方法模式,事情是我需要每一個工廠我需要解析枚舉。 例如,我有一個類窗口,我根據枚舉建立了一個子類,但是我也有一個類皮膚,按鈕等......並且在它們中的每一箇中我都使用工廠來構建子類。如果我添加另一個枚舉,我不得不解析所有這些工廠以添加我想避免的新子類。 – KayZee 2013-02-12 14:02:45

0

您既可以在你的枚舉實現一個接口,讓他們充當工廠:

interface WindowBuilder { 
    Window makeWindow(); 
} 

enum WindowType implements WindowBuilder { 
    SIMPLE { 
     public Window makeWindow() { return new SimpleWindow() } 
    }, 
    [... other enums] 
} 

,或者你可以使用反射和類綁定到枚舉類型,讓他們(再次)工作作爲廠家:

enum WindowType { 
    SIMPLE(SimpleWindow.class), 
    [... other enums] 

    private final Class<? extends Window> wndType; 

    private WindowType(Class<? extends Window> wndType) { 
     this.wndType = wndType; 
    } 

    public Window makeWindow() { 
     // in fact you will need to either catch the exceptions newInstance can throw, or declare the method can throw them 
     return this.wndType.newInstance(); 
    } 
} 

無論哪種方式,你將能夠爲後來那樣稱呼他們:

Window window = myWindow.getType().makeWindow(); 
+0

我也這麼想過,但它太窄了,因爲很多元素都使用這個枚舉。我不能做像「SIMPLE(SimpleWindow.class,SimpleButton.class,SimpleSkin.class)等等。 – KayZee 2013-02-12 14:17:23