2016-02-12 131 views
1

我們假設我有一個包裝foo與幾個類; Foo1, Foo2, Foo3。他們都實現了IFoo,它有一種方法。現在,我有另一個課程,Baz,它們使用所有這些類。基本上baz需要調用每個IFoo類的方法。動態創建對象的正確Java方法是什麼?

注:

  • 它們可以被重複使用。意思是,我們只需要創建一次。
  • 某天我可能想添加Foo4

現在,我能想到是創建一個單身,FooSingleton它封裝了所有這些類和加載它們的:

  1. 讀文件。
  2. 反射
  3. 只寫了new Foo1();new Foo2();等,在單例的init函數內。

所以我想知道什麼是最好的方式(也許還有另一種巧妙的方法我還沒有想到的)

順便說一句,我遇到了Spring Dependency Injection但看着我一點點的開銷。

+2

我只想叫'新Foo1()'當你需要'Foo1',除非是有原因的,使之更加複雜whihc是我也不清楚。 –

+0

使用Spring,有一種非常自然的方式來做到這一點。如果沒有,'春'的方式是掃描實現IFoo的類的類路徑,將它們實例化爲單例(反射),並允許您在發現的每個事件中調用IFoo中的方法。如果您有一天添加了新的Foo4,您的框架會自動檢測並使用它。 –

+0

@PeterLawrey,'baz'需要他們所有人。基本上'baz'是一個'Runnable',對於每個'run()'它調用每個'IFoo'類的這個方法。 – Elimination

回答

1

你可以使用一個依賴注入框架:它將允許你有單身人士爲IFoo的實例。

你也可以這樣做

FooPool { 

    private List<IFoo> foos; 

    FooPool() { 
     foos.add(Foo1.getInstance()); 
     foos.add(Foo2.getInstance()); 
     foos.add(Foo3.getInstance()); 
    } 

    public List<IFoo> getFoos() { 
     return foos 
    } 
} 

IFoo實施將是單身。你也可以將FoolPool也作爲單例。

1

您的問題可以通過應用工廠模式來解決。

用可以是Bean或靜態的FooFactory類替換您的單例。方法getFoo(?)將包含返回正確對象的邏輯。


編輯:根據您的評論添加另一個建議。

創建一個偵聽器,其中所有IFoo實現將在實例化時註冊。到時候,Baz會在列表中運行並調用在監聽器中註冊的每個IFoo的方法。

+0

但是再次,我需要做一些事情:'FooFactory.create(「foo1」)' – Elimination

+0

或者使用'Enum'而不是'String'。總之,有人需要迭代這個枚舉/字符串列表。 – Elimination

+0

在所有Foos中選擇什麼邏輯? –

1

每次運行()調用每一個IFoo的類

我用enum爲戰略類,那裏是每個戰略

interface IFoo { 
    void doSomething(); 
} 

enum Foos implements IFoo { 
    FOO1 { 
    public void doSomething() { 

    } 
    }, 
    FOO2 { 
    public void doSomething() { 

    } 
    }, 
    FOO3 { 
    public void doSomething() { 

    } 
    } 

}

一個實例的這種方法

給所有實例打電話doSomething

for (IFoo foo : Foos.values()) { 
    foo.doSomething(); 
} 

這裏是我用過這個的一個例子。

https://github.com/OpenHFT/Chronicle-Wire/blob/master/src/main/java/net/openhft/chronicle/wire/WireType.java

+0

非常整齊!我不知道這樣的事情可以做 – Elimination

+1

@Elimination當我想在單元測試中測試所有可能的實現時,我在循環中使用值, –

+1

@Elimination你不能爲一個枚舉子類化,但你可以有更多的而不是一個枚舉實現相同的接口並收集這些實現。 –

相關問題