2014-03-06 35 views
0

我正在開發兩個具有相似但邏輯不相同的Android應用程序,並且我想在它們之間共享代碼。目前,我爲每個應用程序都有一個項目,還有一個用於共享類的附加項目。共享類項目是一個庫,並且應用程序項目鏈接到此庫。在項目之間共享Singleton邏輯,並對每個項目進行修改

我遇到的問題是一個負責從服務器獲取數據並緩存該數據的類。這個類被稱爲DataSingleton。獲取數據的邏輯對於兩個應用程序都是一樣的,有些則不同。我的問題是如何設計這個類來支持這個。

這裏有一些限制:

  1. 數據辛格爾頓應該是單身,它的名字所暗示的。
  2. 共享項目中的一些共享邏輯使用DataSingleton,因此DataSingleton也必須位於共享類項目中(否則我會發生構建錯誤)。
  3. 我不想將應用程序特定的邏輯放在共享項目中。

如果這是C++,我會有2個不同的類名DataSingleton - 每個應用程序中有一個 - 然後讓鏈接器連接正確的類。這兩個類都可以從一些通用基類繼承,來處理共享邏輯的代碼共享。我可以在Java中做類似的事嗎?

如果有幫助,我可以在應用程序啓動時用一些參數來「初始化」DataSingleton,這將決定它的行爲。我想過要給它傳遞一個類,但是那個類沒有權限訪問DataSingleton的私有成員。

什麼是「正確」的方式來做到這一點?

回答

1

想想單身。它是一個三級分類: 1.它有一個業務邏輯 2.它創建自己的實例 4.它擁有這個單一實例並提供對它的訪問。

你想要持有多於一個類的實現。這意味着你需要接口和/或抽象基類和幾個具體的類。但在這種情況下,最好的解決方案是將#1與#2和#3分開:創建DataFetcher的層次結構(對不起,我更改了名稱DataSingleton,因爲它不再描述實際情況)和DataFetcherAccessor

interface DataFetcher {} 
class DataFetcher1 implements DataFetcher{} 
class DataFetcher2 implements DataFetcher{} 

class DataFetcherAccessor<A extends DataFetcher> { 
    private static A accessor; 

    public static void setImpl(Class<A> c) { 
     accessor = c.newInstance(); 
    } 

    public static A getAccessor() [ 
     return accessor; 
    } 
} 

顯然有很多其他解決方案。例如,您可以使用SPI來查找您的界面的可用實施。您也可以自己掃描您的類路徑並發現接口DataFetcher的可用實現,或使用Reflections來實現此目的。

0

DataSingleton剝離在需要在不同項目中更改的零件的共享項目中,將其定義爲抽象類並將其名稱更改爲AbstractDataSingleton或類似的東西,然後在每個產品中創建2個獨立的類稱爲DataSingleton或其他什麼,並使它們在共享項目中擴展AbstractDataSingleton

+0

我有一些使用DataSingleton的共享邏輯。它將如何知道現在使用哪個類? –

+0

您必須更清楚地解釋「共享邏輯」的含義。假設你的應用程序不互相交互,任何時候都不會有2個'DataSingleton',如果運行ProjectA,那麼如果ProjectB運行,共享邏輯將使用擴展的ProjectA的'DataSingleton',那麼共享邏輯將使用擴展ProjectB的'DataSingleton' –

+0

如果您需要獨立運行共享項目(儘管您說它只用作庫),您可以在'AbstractDataSingleton'旁邊創建一個'DataSingleton',它將其擴展幷包含必要的數據並且可以單獨用於Shared項目的需求,但不會被ProjectA或ProjectB使用 –