2014-03-06 2 views
0

비슷한 논리이지만 다른 두 가지 Android 응용 프로그램을 개발 중이며 둘 사이에 코드를 공유하려고합니다. 현재 각 응용 프로그램에 대한 프로젝트와 공유 클래스에 대한 추가 프로젝트가 있습니다. 공유 클래스 프로젝트는 라이브러리이며 응용 프로그램 프로젝트는이 라이브러리에 링크됩니다.각 프로젝트마다 수정 된 프로젝트 간 싱글 톤 논리 공유

문제는 서버에서 데이터를 가져 와서 해당 데이터를 캐싱하는 클래스에 있습니다. 이 클래스는 DataSingleton이라고합니다. 데이터를 가져 오는 데는 두 가지 응용 프로그램에서 모두 동일한 논리와 다른 두 가지 논리가 있습니다. 내 질문은 이것을 지원하는 클래스를 설계하는 방법입니다. 이름으로 묵시적으로,

  1. 데이터 싱글은 싱글해야한다 :

    여기에 몇 가지 제한이 있습니다.

  2. 공유 프로젝트의 공유 논리 중 일부는 DataSingleton을 사용하므로 DataSingleton도 공유 클래스 프로젝트에 있어야합니다. 그렇지 않으면 빌드 오류가 발생합니다.
  3. 공유 프로젝트에 응용 프로그램 관련 논리를 넣고 싶지 않습니다.

이것이 C++ 인 경우 각 응용 프로그램마다 2 개의 다른 클래스 이름 DataSingleton이 있고 링커에 올바른 클래스를 연결하게합니다. 두 클래스 모두 공유 논리에 대한 코드 공유를 처리하기 위해 공통 기본 클래스에서 상속받을 수 있습니다. 자바에서 비슷한 것을 할 수 있습니까?

도움이된다면 응용 프로그램 시작시 DataSingleton의 동작을 결정하는 인수를 사용하여 "초기화"할 수 있습니다. 클래스를 전달하려고 생각했지만 그 클래스는 DataSingleton의 private 멤버에 액세스 할 수 없습니다.

이 작업을 수행하는 "올바른"방법은 무엇입니까?

답변

1

싱글 톤에 대해 생각해보십시오. 3 개의 thig를하는 클래스입니다 : 1. 비즈니스 로직이 입니다. 2. 자체 인스턴스를 생성합니다. 4.이 단일 인스턴스를 보유하고 있으며이 인스턴스에 대한 액세스를 제공합니다.

클래스의 구현을 두 개 이상 보유하려고합니다. 즉, 인터페이스 및/또는 추상 기본 클래스와 여러 구체적인 클래스가 필요합니다. 하지만이 경우 가장 좋은 해결책은 # 2와 # 3에서 # 1을 분리하는 것입니다. 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

"공유 논리"가 의미하는 바를보다 명확하게 설명해야합니다. 응용 프로그램이 서로 상호 작용하지 않는다면 ProjectA가 실행되면 ProjectB가 실행되면 공유 논리가 확장 된 ProjectA의 'DataSingleton'을 사용하고 ProjectB가 실행되면 공유 논리가 확장 ProjectB의'DataSingleton' –

+0

공유 프로젝트를 독립 실행 형으로 실행해야하는 경우 (라이브러리로만 사용되었다고 말했지만) 확장 한'AbstractDataSingleton' 옆에'DataSingleton'을 생성하여 필요한 데이터를 포함 할 수 있습니다 공유 프로젝트의 필요에 대해서만 독립 실행 형으로 사용할 수 있지만 ProjectA 또는 ProjectB에서는 사용하지 않습니다. –