2014-08-28 2 views
0

이것은 건축 학적 질문 일뿐입니다. 모든 클래스에 액세스 할 수있는 프로젝트의 전역 개체를 갖고 싶습니다. 필요할 때마다 인스턴스를 만들지 않아도됩니다. 객체 자체는 다른 서비스의 구성입니다. 내 첫 번째 접근 방식은 객체가 인스턴스화 된 인터페이스를 정의한 다음 implements이라고 말하면서 각 클래스에 주입 할 수있는 인터페이스를 정의하는 것이 었습니다. 이 접근법이 깨끗하거나 좀 해킹 된 것이라면 내가 알고 싶은 것은 있습니다. 여기에 지금까지 내 구현 :인터페이스에서 글로벌 고유 객체 생성

public final class SystemServices 
{ 
    private final SecurityService securityService; 
    private final PersistencyService persistencyService; 
    private final RecordService recordService; 
    private final DispatcherService dispatcherService; 

    private SystemServices(Builder builder) 
    { 
     this.securityService = builder.securityService; 
     this.persistencyService = builder.persistencyService; 
     this.recordService = builder.recordService; 
     this.dispatcherService = builder.dispatcherService; 
    } 

    public SecurityService getSecurityService() 
    { 
     return securityService; 
    } 

    public PersistencyService getPersistencyService() 
    { 
     return persistencyService; 
    } 

    public RecordService getRecordService() 
    { 
     return recordService; 
    } 

    public DispatcherService getDispatcherService() 
    { 
     return dispatcherService; 
    } 

    public static class Builder 
    { 
     private SecurityService securityService; 
     private PersistencyService persistencyService; 
     private RecordService recordService; 
     private DispatcherService dispatcherService; 

     public Builder setSecurityService(SecurityService securityService) 
     { 
      this.securityService = securityService; 
      return this; 
     } 

     public Builder setPersistencyService(PersistencyService persistencyService) 
     { 
      this.persistencyService = persistencyService; 
      return this; 
     } 

     public Builder setRecordService(RecordService recordService) 
     { 
      this.recordService = recordService; 
      return this; 
     } 

     public Builder setDispatcherService(DispatcherService dispatcherService) 
     { 
      this.dispatcherService = dispatcherService; 
      return this; 
     } 

     public SystemServices build() 
     { 
      return new SystemServices(this); 
     } 
    } 
} 

는 그리고 이것은으로 systemservices의 인스턴스가 생성되는 인터페이스입니다 :

public interface ServiceProvider 
{ 
    public static SystemServices systemServices = new SystemServices.Builder() 
      .setSecurityService(new SecurityService()) 
      .setPersistencyService(new PersistencyService(new BlackBoxDb(BlackboxApplication.getAppContext()))) 
      .setRecordService(new RecordService()).setDispatcherService(new DispatcherService()).build(); 
} 

지금 난 그냥 systemServices.getSecurityService.doSomethingSecurityRelated()

를 사용하여 모든 클래스의 개체에 액세스 할 수

코드가 작동하고 초보자로서 나에게 너무 좋을 것 같지만, 그 접근법에 뭔가 못 생겼습니다. 그래서 어떤 비판도 높이 평가됩니다 :) 또한 JVM이 인터페이스를 처리하는 방법도 흥미로울 것입니다. 그것은 실제로 단 하나의 단일 톤 객체입니까 아니면 각 클래스에 대해 하나의 객체를 생성합니까?

답변

1

JVM이 원하는대로 인터페이스를 처리하므로 하나의 SystemServices 만 만들어집니다. 그러나 당신이 묘사하는 접근법은 참으로 '추악한'것으로 간주됩니다. 스프링과 같은 의존성 주입 프레임 워크를 사용하는 것이 가장 좋은 방법이라고 생각합니다. 다른 클래스에서 액세스 할 수있는 전역 개체가 있으면 필요한 것만으로도 매우 좋습니다. 또한 테스트가 훨씬 쉬워지고 전역 개체를 사용해야하는 것을 빠르게 변경할 수 있습니다.

0

나는 못생긴거나 해킹한다고 말하지 않을 것입니다. 더 특이하고 독자적입니다.

실제로 모든 클래스에 종속성을 주입하는 방법은 꽤 가볍고 가볍습니다. 이론적으로 나쁜 구현을 변경하려면 인터페이스를 다시 컴파일해야하지만 실제로는 요구 사항에 따라 중요하지 않을 수도 있습니다. 예를 들어 모의 SecurityService를 제공하기 위해 ServiceProvider 인터페이스를 다시 작성해야하므로 단위 테스트가 어려워집니다.

저는 BlackboxApplication.getAppContext()처럼 봄에 의존하는 것처럼 보입니다. 스프링 컨텍스트에서 모든 서비스를 사용 가능하게 만드는 것이 어떻습니까? 스프링에 의해 관리되지 않는 클래스에서 사용할 수 있기를 원하기 때문입니까? 스프링 컨텍스트의 주석 기반로드로 인해 큰 오버 헤드가 발생하지 않으며 스프링은 많은 훌륭한 인프라 코드를 구매합니다.

나는 이미 봄을 사용하는 것에 대해 잘못 될 수 있습니다. 그렇지 않다면 나는 당신의 접근 방식에 아무런 문제가 없음을 알 수 있습니다. 그것은 처음에 나를 놀라게했다! 그러나 그것은 멋집니다.

+0

우선 : 감사합니다. 그것의 unidiomatic 비록 긍정적 인 피드백을 얻는 것이 좋다고 느낀다. 글쎄, 이건 안드로이드 응용 프로그램이기 때문에, 여기 스프링은 쓸모가 없다. 언급 된 모든 클래스는 자체 구현입니다 (어쩌면 이것을 명확하게하기 위해 import 문을 추가해야합니다). 내 마음에 오는 어쩌면 더 "관용적 인"접근 방식은 고전적인 Singleton 패턴이 될 것이지만 이미 구현 된 Builder 패턴과 충돌 할 수 있는지 확실하지 않습니다. – JohnPlata

+0

사실, 서비스를 필요로하는 모든 클래스에서 가져 와서 "인스턴스화"하는 싱글 톤은 동일한 것을 수행합니다. 안드로이드에 대한 의존성 주입 프레임 워크가있는 것 같습니다 : http://square.github.io/dagger/ –

+0

그래, 약간의 인터넷 검색 결과 나는 안드로이드 용 Spring 버전도 있지만, 여전히 내 꽤 "작은"응용 프로그램, 그 필요하지 않습니다.나는 싱글 톤 접근법을 내일에 게시 할 것이고, 싱글 톤에 대한 경험이없고 특별히 빌더와의 결합을 전혀하지 않았기 때문에 희망적으로 약간의 피드백을 얻을 것이다. – JohnPlata

관련 문제