在项目之间共享Singleton逻辑,并对每个项目进行修改

时间:2014-03-06 12:49:58

标签: java android

我正在开发两个具有相似但不完全相同的逻辑的Android应用程序,我想在它们之间共享代码。目前,我有一个针对每个应用程序的项目,以及一个用于共享类的附加项目。 shared-classes项目是一个库,应用程序项目链接到这个库。

我遇到的问题是一个负责从服务器获取数据并缓存该数据的类。该类称为DataSingleton。获取数据有一些逻辑对于两个应用程序都是相同的,有些逻辑是不同的。我的问题是如何设计类以支持这一点。

这里有一些限制:

  1. 数据Singleton应该是一个单身,如其名称所示。
  2. 共享项目中的一些共享逻辑使用DataSingleton,因此DataSingleton也必须位于shared-classes项目中(否则会出现构建错误)。
  3. 我不想将特定于应用程序的逻辑放在共享项目中。
  4. 如果这是C ++,我将有2个不同的类名为DataSingleton - 每个应用程序中有一个 - 然后让链接器连接正确的类。这两个类都可以从一些公共基类继承,以处理共享逻辑的代码共享。我可以用Java做类似的事情吗?

    如果有帮助,我可以在应用程序开始时“初始化”DataSingleton,并使用一些参数来确定其行为。我想过将一个类传递给它,但是那个类没有访问DataSingleton的私有成员。

    这样做的“正确”方法是什么?

2 个答案:

答案 0 :(得分:1)

想想单身人士。它是一个做3 thigs的类: 1.它有一个业务逻辑 它创造了自己的实例 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

答案 1 :(得分:0)

剥离需要在不同项目中更改的部分的共享项目中的DataSingleton,将其定义为抽象类并将其名称更改为AbstractDataSingleton或类似的内容,然后只需在每个名为DataSingleton的产品中创建2个单独的类或其他类,并使它们扩展共享项目中的AbstractDataSingleton