2013-09-26 3 views
0

싱글 톤 패턴의 위력은 다음과 같습니다. 오브젝트 (인스턴스)를 한 번만 초기화하십시오. 그러면 정적이 아닌 멤버와 상호 작용할 수 있습니다. 하지만 Singleton 패턴에 대해 더 강력한 것은 생성자입니다.C#의 싱글 톤 패턴

오브젝트를 초기화하는 생성자가 필요 없다면, 싱글 톤 패턴은 의미가없고 정적 클래스를 사용할 수 있습니다.

그러나 생성자에 매개 변수를 가져 오려면 어떻게해야합니까?

생성자는 객체를 초기 값으로 초기화하는 객체와 objecs를 매개 변수를 통해 가져 오는 값으로 초기화하는 두 가지 옵션이있는 역할이 하나 있으므로 두 번째 객체를 생략한다고 말할 수 있습니까?

그렇지 않으면, 싱글 톤 패턴과 정적 클래스 사이의 차이점은 무엇입니까?

감사합니다, 야곱

+1

(그 복제본은 "정적 클래스"부분을위한 것입니다.) 근본적으로, 싱글 톤에 매개 변수가 필요한 경우 문제가 발생합니다. 대신 팩토리 클래스를 고려해야합니다. (GetInstance 또는 다른 값을 사용하는 두 번째 호출이 발생하면 어떻게됩니까?) –

+0

수행 할 작업을 결정한 후 여기에 싱글 톤 구현을위한 버전이있는 페이지가 있습니다. http://www.yoda.arachsys.com/csharp/ singleton.html – ilansch

답변

1

"싱글 톤 패턴 : 한 번만 객체 (인스턴스)를 초기화"이 같은 것을 할 수 있습니다 : 당신은 매개 변수를 전달

public class MyClass { 

    MyClass me = null; 

    //private CTOR 
    private MyClass () { 
    } 

    public static MyClass ConstructMe(..parameters..) { 

     if(me != null) 
      return me; 

     me = new MyClass(); 
     ....setup parameters .... 
     return me, 
    } 

} 

을, 당신은 할 수 있습니다 단 하나의 인스턴스.

요청하시는 것이 아닌 경우 명확히하십시오.

+1

(me! = null)이 나를 돌려 주어야합니다. –

+0

@AlessandroDaRugna : 오타, 감사합니다! – Tigran

1

1) 항상 인수를 필요로하는 한 인수를 취하는 단일 패턴에서 이니셜 라이저를 구현하는 것을 막을 수있는 방법은 없습니다. 의사 코드 : 싱글 톤 클래스를 확장 할 수 있고, 다른 클래스를 확장 할 수 있습니다

class single{ 
    private static single instance; 
    private single(){ 
     default args; 
    } 
    private single(arg1, arg2){ 

    } 
    public static init(){ 
     if(instance == null){ 
      instance = new single(); 
     } 
     return instance; 
    } 
    public static init(arg1, arg2){ 
     if(instance == null){ 
      instance = new single(arg1, arg2); 
     } 
     else{ 
      instance.setArg1(arg1); 
      instance.setArg2(arg2); 
     } 
     return instance; 
    } 
} 

2) - OOP의 모든 기능을 제공는 정적 클래스는 기능 조직의 구조화 된 방법이다.

0

싱글 톤의 생성자에 매개 변수가 필요한 경우 디자인 결함 IMO가 있습니다.

인스턴스 작성 후 setter를 사용하여 멤버를 초기화하거나 멤버 함수의 매개 변수로 필요한 인스턴스를 전달할 수 있습니다.

public class MyClass { 

    static MyClass single = null; 
    MyMember member; 

    private MyClass() { 

    } 

    public static MyClass getInstance() { 
     if(single == null) 
      single = new MyClass(); 
     return single; 

    } 

    //------------------------------------------------------------ 
    // First approach using setter 
    public void setMember(MyMember member) { 
     this.member = member; 
    } 

    public void doSomething() { 
     member.foo(); 
     // do something 
    } 

    //------------------------------------------------------------ 
    // Second approach pass by parameter 
    public void doSomething(MyMember param) { 
     param.foo(); 
     // do something 
    } 
}