2014-05-12 87 views
0

假設我有兩個類A1,A2,它們應該以不同的方式實現相同的功能(假設它們都實現了void f()方法)。創建一個類的唯一實例,當有幾個實現時

在我的應用程序中,我一次只使用其中的一個。

爲了做到這一點,我用方法f()創建了一個接口A,並讓A1繼承它。

然後,我考慮創建一個叫做AHolder的單例,它在任何時候都只能容納一個A類(A1或A2)。 AHolder將通過從配置中讀取來確定其A類的實例類型。

事情是,我想以一種不允許創建多個A類的方式來實現它(即使我創建了A1單元 - 我仍然可以創建每個單例 - 這意味着A類的2個實例...)

有沒有這樣做的優雅方式?

回答

1

這樣你一次只能有一個實例。

public class AHolder { 

private static A instance; 

private AHolder() { 
} 

    public synchronized static A getInstance() { 
    if (instance == null) { 
     if (Config.getAHolderType() == "A1") { 
      instance = new A1(); 
     } else if (Config.getAHolderType() == "A2") { 
      instance = new A2(); 
     } else { 
     throw new IllegalStateException("class type not specified"); 
     } 
    } 

    return instance; 
    } 
+0

那樣A1&A2的構造函數必須公開。這意味着每個人都可以調用新的A1()或新的A2()創建它的第二個實例... – user1028741

+0

你可以使它包裝私人...把AHolder和A1和A2放在同一個包中......並且不要'把'公開'放在A1和A2的構造函數上。這樣,只有該包中的類才能夠實例化這些類。 –

+0

這是一個好主意,但它不會讓別人(比如另一個程序員)實例化另一個類的實例,如果他工作在特定的包上的話......我想知道是否有解決方案可以確保實例的唯一性(如一個實例類型的Singleton模式)。 – user1028741

相關問題