싱글 톤의 대안
애플리케이션에 대한 구성 정보를 보유하는 클래스가 있습니다. 예전에는 싱글 톤이었습니다. 아키텍처 검토 후 싱글 톤을 제거하라는 지시를 받았습니다. 서로 다른 구성을 한 번에 모두 테스트 할 수 있기 때문에 단위 테스트에서 싱글 톤을 사용하지 않는 많은 것이 있습니다.
싱글 톤이 포함 코드의 모든 곳에서 인스턴스를 전달해야합니다. 너무 지저분 해져 싱글 톤 래퍼를 작성했습니다. 이제는 코드를 PHP와 .NET으로 포팅하고 있고, 설정에 더 좋은 패턴이 있는지 궁금합니다.
Google 테스트 블로그 (테스트 가능한 코드를 생성하기 위해) 싱글 방지에 관한 항목의 시리즈가있다. 아마도 이것이 당신을 도울 수 있습니다 :
마지막 기사에서는 새 객체 생성을 팩토리로 만드는 방법에 대해 자세히 설명합니다. 읽을만한 가치가 있습니다.
요컨대 우리는 모든 새로운 운영자를 공장으로 옮깁니다. 우리는 수명의 모든 수명을 하나의 공장으로 그룹화합니다.
가장 좋은 방법은 팩토리 패턴을 대신 사용하는 것입니다. 팩토리에서 클래스의 새 인스턴스를 생성 할 때 단일 팩토리 (팩토리 클래스에 저장)에 대한 참조로 또는 관련 클래스를 복사하여 새로 생성 한 객체에 '글로벌'데이터를 삽입 할 수 있습니다. 새 개체에 데이터를 넣습니다.
그런 다음 모든 수업에 싱글 톤에 존재하는 데 사용됩니다. 전반적으로 많은 차이가 생각하지 않지만 쉽게 읽을 수 있습니다.
여기에 명백한 내용이 Spring 또는 Guice 와 같은 의존성 부여 프레임 워크를 사용할 수없는 이유가 있습니까? (현재 Spring도 .NET 사용할 수 있습니다).
이런 방식으로 프레임 워크는 구성 오브젝트의 단일 사본을 보유 할 수 있으며 Bean (서비스, DAO 등)은 걱정할 필요가 없습니다.
이것이 내가 일반적으로 취하는 것입니다!
Spring Framework 를 사용 하는 경우 일반 Bean을 사용할 수 있습니다. 기본적으로 (또는 명시 적으로 설정 scope="singleton"한 경우) 하나의 Bean 인스턴스 만 작성되고 Bean이 사용 가능하고 또한 검색 될 때마다 해당 인스턴스가 리턴 getBean()됩니다.
Singleton 패턴을 단일 인스턴스를 연결하지 않습니다.
대안은 물건을 요구하는 대신 필요한 것을 전달하는 것입니다.
단일 구성에 대한 책임을 축적하지 개체에 있습니다. 이해하기 쉬운 깨지기 쉬운 매우 큰 개체로 끝납니다.
예를 들어 특정 클래스에 다른 매개 변수가 필요한 경우 Configuration개체 를 변경 한 다음 해당 개체를 사용하는 클래스를 다시 선택합니다. 다소 문제가 있습니다.
공통의 전역 및 큰 Configuration객체 를 피하려는 코드를 리팩토링하십시오 . 필요한 매개 변수 만 클라이언트 클래스에 전달하십시오.
class Server {
int port;
Server(Configuration config) {
this.port = config.getServerPort();
}
}
리팩토링해야합니다.
class Server {
public Server(int port) {
this.port = port;
}
}
의존성 필요 프레임 워크는 여기에 많은 도움이 될 것입니다.
정적 메소드를 사용하여 싱글 톤과 동일한 동작을 수행 할 수 있습니다. Steve yegge는 이 게시물 에서 이를 잘 설명합니다 .
정적 메소드와 필드 만 포함하는 클래스가 가능합니까? 귀하의 상황이 정확히 무엇인지 잘 모르겠지만 조사해 볼 가치가 있습니다.
현재 사용중인 그래픽 툴링 의존성에서 / ioc 도구를 사용하면 di / ioc 컨테이너가 클래스의 인스턴스를 하나 생성하여 필요한 클래스 (예 : IConfigSettings 인터페이스)에 대해 단일 톤 동작을 사용하여 여전히 싱글 톤 성능 / 최적화를 얻을 수 있습니다. 이것은 여전히 테스트로 대체 될 수 있습니다.
또는 팩토리를 사용하여 클래스를 생성 할 때마다 동일한 인스턴스를 반환 할 수 있습니다 테스트를 위해 스텁 / 조롱 된 버전을 사용할 수 있습니다
콜백 인터페이스로 구성 할 가능성을 검토하십시오. 따라서 구성에 민감한 코드는 다음과 같습니다.
MyReuseCode.Configure(IConfiguration)
시스템 초기화 코드는 다음과 같습니다.
Library.init(MyIConfigurationImpl)
종속성 주입 프레임 워크를 사용하여 구성 개체를 전달하는 어려움을 완화 할 수 있습니다. 괜찮은 것은 xml이 아닌 코드를 사용하는 장점이있는 ninject 입니다.
그다지 깨끗하지 않을 수도 있지만 변경하려는 정보 비트를 사용하는 대신 싱글 톤을 생성하는 방법으로 전달할 수 있습니다.
public static Singleton getInstance() {
if(singleton != null)
createSingleton();
return singleton;
}
}
createSingleton(Information info)응용 프로그램 시작시 (및 단위 테스트의 setUp-Methods에서) 직접 호출 할 수 있습니다.
싱글 톤은 나쁘지 않지만 디자인 패턴에 결함이 있습니다. 런타임 중에 단일 인스턴스 만 만들고 싶지만 결정 론적 결과를 보장하기 위해 단위 테스트 중에 여러 개의 격리 된 인스턴스를 만들고 싶은 클래스가 있습니다.
Spring 등을 사용하는 DI는 매우 좋은 옵션이지만 유일한 옵션은 아닙니다.
참고 URL : https://stackoverflow.com/questions/1300655/whats-alternative-to-singleton
'IT' 카테고리의 다른 글
| 비용의 순서를 변경하지 않고 비용의 수준을 재정렬 (0) | 2020.07.26 |
|---|---|
| LINQ ToDictionary와 ToLookup의 차이점은 무엇입니까 (0) | 2020.07.26 |
| Moq를 사용하여 메소드 호출 확인 (0) | 2020.07.26 |
| Gemfile에서 rubygem을 때 ~>와> =의 차이점은 무엇입니까? (0) | 2020.07.26 |
| Bitbucket에서 중첩 목록 항목을 표시하는 방법은 무엇입니까? (0) | 2020.07.26 |