2014-10-22 4 views
7

한 번에 실행중인 객체의 인스턴스가 하나만 있어야한다는 것을 깨달았습니다. StdSchedulerFactory. 지금까지 나는이 NameValueCollection 인이매개 변수가있는 객체의 싱글 톤 클래스

StdSchedulerFactory sf = new StdSchedulerFactory(properties); 

그리고 속성과 같은 객체를 인스턴스화. 변수 sf이 프로그램 전체에서 하나의 인스턴스를 갖도록이 객체에 대해 Singleton 클래스를 작성하려면 어떻게해야합니까?

+1

[싱글 톤 구현 방법] (http://msdn.microsoft.com/en-us/library/ff650316.aspx) 또는 [예제 ] (http://www.dotnetperls.com/singleton) – alykins

+0

누군가가 두 번째 인스턴스를 생성하면 어떻게됩니까? 적절한 단위 테스트를하지 않는 것이 좋지 않을까요? – nvoigt

+0

@noveigt 싱글 톤을 단위 테스트하는 것이 완벽하게 가능하다. 인터페이스를 파생시킬 필요가있다. 그런 다음 다른 객체를 테스트하기 위해 조롱 할 수 있으며, * it *을 테스트 할 때 싱글 톤은 중요하지 않습니다. (이 작업을하려면 DI 컨테이너가 필요합니다.) – BradleyDotNET

답변

9

패턴 부분은 일반적으로 개인 생성자이므로 다른 클래스는 새 인스턴스를 만들 수 없습니다.

는 "초기화"또는 "구성"기능을 추가하는 클래스가 외부에서 오는 매개 변수에 대한 해결 방법 :이 함수를 호출하는 것을 잊지 경우, 물론

public static void Configure(NameValueCollection properties) 
{ 
} 

, 당신은 행동을 얻을 수 있습니다 당신 돈 원하지 않는다. 그래서이 함수가 아직 호출되지 않았다면 다른 함수가 적절하게 반응 할 수 있도록 "Configured"플래그 또는 이와 비슷한 것을 설정하는 것이 좋습니다.

+0

미안하지만이 점을 정말로 이해하지 못합니다. 내 구성에서 Configure 기능을 사용해야하는 방법을 알려주시겠습니까? – Disasterkid

+0

@Pedram 싱글 톤 클래스의 public 메소드. 프로그램 시작 근처에서 언젠가 그것을 호출한다. (바람직하게는 인수에 의존하는 메소드가 호출되기 전에). – BradleyDotNET

+0

@BradleyDotNET은 Singleton에서 필요로하는 것입니다. 즉, 이것은 (+1)해야 할 일을 해결합니다. 그러나 "곡식에 반대"하고 싶지는 않습니까? 이것은 드문 일입니까? – Thomas

1

다음은 기본적인 싱글 톤 구현입니다. 이 아니고 스레드로부터 안전합니다.

public sealed class StdSchedulerFactory 
{ 
    private static readonly StdSchedulerFactory instance; 
    private NameValueCollection _properties; 

    private StdSchedulerFactory(NameValueCollection properties) 
    { 
     _properties = properties; 
    } 

    public static StdSchedulerFactory GetInstance(NameValueCollection properties) 
    { 
     if (instance == null) 
     { 
     instance = new StdSchedulerFactory(properties); 
     } 
     else 
     { 
     return instance; 
     } 
    } 
} 
+1

주목할만한 점은 상단에 readonly 객체를 추가하는 것이 threadsafe (그리고 프로퍼티/메소드 주위에 적절한 잠금)를 만드는 쉬운 방법이라는 것입니다. – alykins

+2

아마도 속성을 전달하기위한 것입니다. 이 패턴이 싫어 ...즉 속성 집합을 전달한다는 의미지만 완전히 다른 ** 속성 집합으로 인스턴스를 만듭니다. 나는 나에게 거짓말을하는 방법이 싫다. – nvoigt

+0

옙, 놓 쳤어. 나는 동의한다, 더 나은 방법이있다. –

1

이것은 간단한 싱글 톤 패턴을 구현하는 두 가지 가장 좋은 방법입니다. 두 번째 것은 디버깅 할 때 훨씬 쉽습니다.

public sealed class SingletonOne 
{ 
    private static readonly Lazy<SingletonOne> instance = new Lazy<SingletonOne>(() => new SingletonOne()); 

    private Lazy<Controller> controller = new Lazy<Controller>(() => new Controller(properties)); 

    private static object properties = null; 

    public static SingletonOne Instance { get { return instance.Value; } } 

    public Controller GetController(object properties) 
    { 
     SingletonOne.properties = properties; 

     return this.controller.Value; 
    } 
} 

public sealed class SingletonTwo 
{ 
    private static readonly SingletonTwo instance = new SingletonTwo(); 

    private Controller controller; 

    private static object properties = null; 

    public static SingletonTwo Instance 
    { 
     get 
     { 
      return SingletonTwo.instance; 
     } 
    } 

    public Controller GetController(object properties) 
    { 
     SingletonTwo.properties = properties; 

     if(this.controller == null) 
     { 
      this.controller = new Controller(SingletonTwo.properties); 
     } 

     return this.controller; 
    } 
} 

public class Controller 
{ 
    public Controller(object properties) { } 
}