2012-12-10 2 views
1

코딩시에는 Singleton이라는 패턴이 있으며, 클래스의 인스턴스화를 하나의 단일 객체로 제한합니다. 그러나 모듈 수준에서 클래스를 인스턴스화 할 수 있다면 Singleton을 사용해야하는 이유는 무엇입니까? 밑줄로 이름을 정하고 그냥 사용 하시겠습니까? 왜 Singleton을 사용해야합니까?싱글 톤 패턴은 언제 중요합니까?

구체적으로 (구체적인 대답은 없기 때문에) 여기에 구체적인 예가 나와 있습니다. 나는 표준 파이썬 클래스를 지정하고 인스턴스 생성 :이 구현은 아래의 두 번째 인스턴스의 생성을 방지하지 않는다는 사실 외에

class MyObject(object): 
    .... 

_myinstance = MyObject() 

을 어떤 상황이 간단한 구현보다 싱글의 사용 낫다?

+0

귀하의 질문은 흥미 롭습니다. 실제로 싱글 톤이 필요하지 않은 경우에는 사용하지 마십시오. 싱글 톤은 테스트 가능성과 멀티 스레드 환경에 좋지 않습니다 http://stackoverflow.com/questions/11292109/why-is-singleton-considered-an-anti-pattern-in-java-world-sometimes [당신의 싱글 톤을 현명하게 사용하십시오] (http://www.ibm.com/developerworks/webservices/library/co-single/index.html) –

답변

1

싱글 톤 패턴은 리소스를 생성하는 데 비용이 많이 드는 재사용을 원할 때 유용합니다. 생성이 응용 프로그램의 전체 수명 동안 단 한번 수행되기 때문에 가격을 한 번만 지불하게됩니다.

+0

그러나이 경우에는 모듈을 사용하지 않고도 비싼 클래스의 단일 인스턴스를 작성할 수 있습니다 싱글 톤. 어쩌면 이해가 안될까요? – Alex

+0

@Alex이 모듈이 오직 당신에게만 속하고, 아무도 그 모듈의 소스 코드에 접근 할 수 없다면, 그렇습니다. 어쨌든이 클래스를 한 번만 생성하면 좋은 선택이 될 것입니다. – dantuch

+0

@Alex, 맞습니다.이 케이스에 대한 리소스의 단일 인스턴스를 만들 수 있습니다 => 그게 싱글 톤 패턴이 정확히 무엇인지 :-) 당신이 사용할 패턴의 이름입니다. –

1

싱글 톤 패턴은 점유 된 메모리 또는 생성 시간면에서 자원이 비싼 경우에 유용합니다. 싱글 톤 패턴에서 찾을 수있는 또 다른 사용법은 응용 프로그램 요구 사항에 대한 클래스 기반의 인스턴스 수를 제한 할 수 있다는 것입니다. 한 가지 예는 데이터베이스에 대한 연결이며, 여기서 스레드 당 항상 하나의 연결을 만듭니다 , 그 연결은 일반적으로 스레드와 함께 살아 있습니다.

0

싱글 톤은 본질적으로 일부 엔티티가 단일 인스턴스 만 가져야한다는 개념입니다. 단일 인스턴스에 대한 이유는 다양 할 수 있습니다. 주요 인스턴스는 다음과 같습니다.

  • 다른 모듈에서 공유 가능한 리소스를 다시 사용하십시오.
  • 리소스의 여러 인스턴스를 허용하지 않습니다.
  • 사용중인 모듈이 준비되지 않은 경우 (예 : 프로그램 코드가 실행되기 전에 작성되고 초기화되는 전역 변수) 인스턴스를 생성합니다. 따라서 사용 모듈이 만들어지면 전역이 준비됩니다.
0

싱글 톤을 사용하는 이유는 대체 방법에 따라 달라집니다.

클라이언트 코드의 한 지점에서 명시 적으로 생성 된 객체와 비교할 때, 싱글 톤은 여러 클래스, 패키지, 모듈 등에서 액세스하기가 더 쉽습니다. 이점은 있지만 밀접하게 결합 된 코드를 만들 수 있습니다. 명시 적 접근 방식은 종속성을 명확하게하지만 구현이 어렵습니다. 특히 기존 코드를 빌드 할 때 특히 그렇습니다.

실제로 내가 실제로 보아 왔던 싱글 톤의 대안은 사실상 준 전역 변수의 집합 인 "클래스"입니다. 이것에 비해 싱글 톤 (또는 다른 객체)은 코드의 다른 부분에 걸친 연결을 제한하고 다른 클래스를 테스트 할 때 스텁이나 모의로 바꾸기 쉽거나 테스트를 쉽게 수행 할 수 있으므로 큰 개선점이 있습니다. 그리고 나중에 하나 이상의 인스턴스를 허용하도록 코드를 수정하는 것이 훨씬 쉬워집니다. 많은 경우 인스턴스가 하나만 있어야한다는 요구 사항은 그리 강력하지 않으며 이러한 유연성이 유용 할 수 있습니다.

글로벌 변수를 사용하는 기존 코드를 리팩토링 할 때 싱글 톤은 달성 가능한 첫 번째 단계가 될 수 있습니다.이 단계는 필요한 경우 추가 작업을할만한 가치가있는 경우 명시 적으로 생성 된 개체로 리팩터링 될 수 있습니다.