이것은 건축 학적 질문 일뿐입니다. 모든 클래스에 액세스 할 수있는 프로젝트의 전역 개체를 갖고 싶습니다. 필요할 때마다 인스턴스를 만들지 않아도됩니다. 객체 자체는 다른 서비스의 구성입니다. 내 첫 번째 접근 방식은 객체가 인스턴스화 된 인터페이스를 정의한 다음 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이 인터페이스를 처리하는 방법도 흥미로울 것입니다. 그것은 실제로 단 하나의 단일 톤 객체입니까 아니면 각 클래스에 대해 하나의 객체를 생성합니까?
우선 : 감사합니다. 그것의 unidiomatic 비록 긍정적 인 피드백을 얻는 것이 좋다고 느낀다. 글쎄, 이건 안드로이드 응용 프로그램이기 때문에, 여기 스프링은 쓸모가 없다. 언급 된 모든 클래스는 자체 구현입니다 (어쩌면 이것을 명확하게하기 위해 import 문을 추가해야합니다). 내 마음에 오는 어쩌면 더 "관용적 인"접근 방식은 고전적인 Singleton 패턴이 될 것이지만 이미 구현 된 Builder 패턴과 충돌 할 수 있는지 확실하지 않습니다. – JohnPlata
사실, 서비스를 필요로하는 모든 클래스에서 가져 와서 "인스턴스화"하는 싱글 톤은 동일한 것을 수행합니다. 안드로이드에 대한 의존성 주입 프레임 워크가있는 것 같습니다 : http://square.github.io/dagger/ –
그래, 약간의 인터넷 검색 결과 나는 안드로이드 용 Spring 버전도 있지만, 여전히 내 꽤 "작은"응용 프로그램, 그 필요하지 않습니다.나는 싱글 톤 접근법을 내일에 게시 할 것이고, 싱글 톤에 대한 경험이없고 특별히 빌더와의 결합을 전혀하지 않았기 때문에 희망적으로 약간의 피드백을 얻을 것이다. – JohnPlata