중복될 수 있음:** 싱글톤이 뭐가 그렇게 나쁜가요?](https://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons)
많은 디자인 패턴이 경우에 따라 남용될 수 있다는 것은 이해할 수 있으며, 엄마가 항상 말했듯이 "너무 좋은 것이 항상 좋은 것은 아니다!"라는 말이 있습니다;
요즘 싱글톤을 많이 사용하고 있는데, 나 자신도 디자인 패턴을 남용하고 나쁜 습관에 점점 더 깊이 빠져들고 있는 것은 아닌지 걱정이 됩니다.
사용자가 작업하는 동안 상당히 큰 계층적 데이터 구조가 메모리에 유지되는 Flex 애플리케이션을 개발하고 있습니다. 사용자는 필요에 따라 데이터를 로드, 저장, 변경 및 새로 고칠 수 있습니다.
이 데이터는 싱글톤 클래스를 통해 중앙 집중화되며, 이 클래스는 몇 개의 ArrayCollection, 배열, 값 객체 및 게터와 세터를 통해 노출된 기타 네이티브 멤버 변수를 집계합니다.
애플리케이션의 어느 곳에서나 데이터에 대한 참조를 가져오기 위해 모든 사람이 익히 알고 있는 Model.getInstance() 메서드 유형을 사용합니다. 이렇게 하면 애플리케이션 수명 동안 인스턴스는 한 번만 존재할 수 있다고 설계할 때 말했듯이 항상 동일한 데이터 사본을 손에 넣을 수 있습니다.
이 중앙 데이터 저장소에서는 예를 들어 속성 변경 이벤트를 쉽게 디스패치할 수 있으며, 중앙 데이터를 참조하는 여러 UI 컴포넌트가 발생된 데이터 변경 사항을 반영하도록 디스플레이를 업데이트할 수 있습니다.
지금까지 이 접근 방식은 효과적이었으며 우리 상황에 매우 실용적인 것으로 입증되었습니다.
하지만 새 클래스를 만들 때 약간 과욕이 있다는 것을 알게 되었습니다. 클래스를 싱글톤으로 만들어야 하는지, 아니면 팩토리를 사용하는 등 다른 방식으로 관리해야 하는지 등의 질문은 때때로 약간의 불확실성과 함께 약간 어려워지는 경향이 있습니다.
싱글톤은 어디에 선을 그어야 하나요? 싱글톤을 사용할 때와 사용하지 않을 때를 결정할 수 있는 좋은 가이드라인이 있나요?
또한 디자인 패턴에 관한 좋은 책을 추천해 주실 수 있나요?
예, 싱글 나쁜거라 있다. 그들은 그들이 행하는 모든 것은 두 가지 속성 때문에 나쁜거라 당신꺼에요 합칩니다 나쁜 것은 각각 약 95% 의 하게하면서요. (싱글 모두 나쁜 것은 되는 평균 99.75% 의 시간;)
고프 singleton 의해 정의된 대로, 있는 데이터 구조입니다.
첫 번째는 나쁜 효시로 여겨지고 있다. # 39, 우리는 don& 마음에 전역 변수. 그러나 일반적으로, 두 번째는 좀 더 미묘한 거의 없는 경우가 있는데 이는 적용할 수 있는 합리적 제한 .
가끔 이해할 수 있을 뿐 아니라 객체를 인스턴스에서는. 이 경우 하나만 만들 수 있습니다. # 39, t need a 싱글턴 감독에게 너회가 don& 적용할 방침이다.
때문에, 보통 때에도 " sense"; 그 후, 알고보니 하지 감지에서 다란다 한 인스턴스만을 알 수 있다. # 39, re you& sooner or later, 더 이상 필요 이상의 로그기록기. 또는 둘 이상의 데이터베이스. # 39, 또는 you& 하고, 이를 통해 각 유닛 테스트 할 것입니다 재생성합니다 리소스에는 만들어보십시오 임의로 수 있어야 한다. 중간에 제거) 의 코드, 전에 우리가 이해하는 것은 유연도를 각오하랬지.
높이는 숨기십시오 종속물과의 싱글 커플링 (각 클래스 수도 있는데 따라 singleton 즉, 클래스 한 수 없는 우리의 모든 싱글 또한 다른 프로젝트에서 재사용됩니다 재사용합니다) 이 바로 나타나지 않는 데다 종속물과의 같이 함수 / 구성자를 매개변수입니다), 우리는 그들을 # 39, t, t 디이브이 don& # 39, 일반적으로 생각할 때 우리는 don& 만들어보십시오. # 39 의 it& singleton 의 이 같은 행위를 그냥 이렇게 쉽게 당기십시오 거의 모든 로컬 변수 때문에, 우리는 그들을 많이유 they& re 저기예요 # 39 한 번 사용하는 경향이 있습니다. 그리고 그들을 다시 제거 할 수 있는 것은 거의 불가능하다. 스파게티 코드 갖추고 있지만, 스파게티, 아마도 너회가 다니엘을 상관 없는 그래프. 각 싱글 및 sooner or later 너회의 가출 후 시작 한다는 것을 의미하는 것으로 종속물과의 따라 다른 확보하십시오 경우 사용순환 종속물과의 시도한 초기화되었습니다.
그들이 하는 것이 매우 어려운 단위 테스트. (어떻게 점심시간요 호출하는 함수를 기능을 singleton 객체에는? 하지만 실제 우리가 don& # 39, 한원소 집합 t 다운로드하려는 막을 수 있는 코드를 행사한 어떻게?
예, 싱글 나쁜거라 있다.
가끔 정말 로렌아줌마가 노드전역. 그러면 노드전역 아닌, 한원소 집합.
가끔, 아주 아주 드물게 여러 인스턴스입니다 클래스 만드는 상황이 있을 수 있습니다, 어디에 오류가 발생하는 오류를 일으키지 않으면서 수행됨 않을 수 있습니다. (약 유일한 경우 내가 생각할 수 있는, 심지어 경우, 즉 나 # 39, re 사이트용 you& 일부 하드웨어 디바이스입니다. 하나 밖에 없습니다 GPU, 만일 you& # 39, re going 매핑하려면 오브젝트에 코드에서 쉽게 이해할 수 있는 것이라고 한 인스턴스만을 존재할 수 있다). 하지만 직접 찾을 수 있다면 이런 상황에서 (그리고 또, 이를 강조하기 위해, 그런 여러 인스턴스들도 심각한 오류를 뿐만 아니라 상황이 ", I can& # 39, 둘 이상의 instance" 모든 용도 없는 것 같습니다;), 그리고 제약 없이 이를 수행할 수 있도록 객체에는 적용하는 것도 있지만, 전역으로라는 가시적입니다.
이러한 각 두 가지 속성 유용할 수 있는 드문 케이스다. 하지만 난 can& # 39 는 그 중 하나의 사례가 될 것 같지는 않다 , 조합으로의 좋은거야.
많은 사람들이 있다는 생각에, 싱글 죄송합니다. 잡을라는데 " oop 호환일 globals." 있다. 아니, they& # 39, 그들은 여전히 같은 문제들을 , 또한 글로벌 그들이실천하는 re 아니라, 일부 다른 소개를 수준들과 전혀 관계가 없다. Plain old 통해 글로벌 singleton 포지셔닝하십시오 nnt 있을 이유가 없다.
기억해야 할 핵심은 디자인 패턴은 추상적인 개념을 이해하는 데 도움이 되는 도구일 뿐이라는 점입니다. 일단 개념을 이해한 후에는 책에 나온 '레시피'에만 국한하는 것은 무의미하며 목적에 가장 적합한 코드를 작성하는 데 방해가 됩니다.
즉, GoF와 같은 책을 읽으면 문제에 대해 생각할 수 있는 더 많은 방법을 제시하여 스스로 무언가를 구현할 때가 왔을 때 문제에 접근할 수 있는 더 넓은 관점을 가질 수 있습니다.
여러분의 경우, 싱글톤을 사용하는 것이 모든 경우에 합리적이라면 바로 사용하세요. '어느 정도' 적합하지만 투박한 방식으로 구현해야 한다면 새로운 해결책을 찾아야 합니다. 완벽하지 않은 패턴을 강제로 적용하는 것은 둥근 구멍에 네모난 못을 박는 것과 비슷합니다.
"이 접근 방식은 효과적이고 우리 상황에 매우 실용적인 것으로 입증되었습니다."라고 말하는 것을 감안할 때 잘하고 있다고 생각합니다.
여기 좋은 책이 몇 권 있습니다:
디자인 패턴에 대한 고전적인 책인 Gang of Four Book - 디자인 패턴의 고전
헤드 퍼스트 디자인 패턴 - 몇몇 사람들이 대안으로 추천하는 책이라고 들었습니다.
소프트웨어 개발자 공존할 수 있는 은혜를 실효를 코딩 스타일을 여부에 따라 두 진영의 분할됩니다 예쁜 고르게, 또는 실용적인 하나.
개인적으로 실용적인 정보 제공을 외곽진입. 가끔 공감하는 룰을 깨는 하고 있고, 단지 당신이 정말로 수락하셔야 연관됨 위험요소요 틀렸다니까 이해할 필요가 있다. &Quot 답변할 수 있는 경우, yes". 이에 대해, 그 아래 질문에 대한 실질적인 혜택을 제공할 수 있는 일부 사용자의 특정 览侩 荤례 싱글턴 패턴.
적절히 사용할 경우 디바이스처럼 프로그래밍 chunghwa 없습니다 촬영 교도관님도요 있는 장소이다.
이 책은 좋아요, 하지만 그들은 항상 충분한 배경, t # 39 는 권장됨 don& 열거하십시오 경험을 기반으로 할 때 함께 제공된 지정값이 싱글턴 선택하여 사용할 수 있습니다.
우리는 우리가 어디에 프로젝트를 시작한 기본적으로 동일한 질문, 즉 모델 , 액세스하려면 평면가공 방법, 특히 루트를 요소. 그러나 Flex app 이 사업이 아닌 놀이를하고! # 39, 모든 것이 아니라, 웹 애플리케이션 (앱) 을 t doesn& 정말이잖아.
(주) 의 인수가 디 다음과 같습니다.
디 가능한 방법은 있다 (자세한 내용은 클래식 기사 에서 파울러):
이에 따라 관점을 싱글턴 패턴 역시 단순히 그런 서비스는 로케이터를 모델리게티누스턴스 () '.' (예:
하지만 미래의 변화에 유연하게 최대화하기 위해 해야 할 지 얼굴을 고유한 개체 참조 , 주위에 최대한 통해 얻은 모델리게티누스턴스 () '및' 필요한 경우에만. 또한 출력 깔끔한 코드.
제 생각에는 싱글 신호를 사용하여 직접 설계 결함. 그 이유는 그들이 보통 객체 생성 및 폐기 메커니즘을 통해 단순히 하나의 무시하려면 내장되었을 c++컴파일러는. 개체의 경우 반드시 통과해야 하는 다른 객체에 대한 참조가 참조입니다 인컨텍스트 건설 it 빛위에 만들거나 새 인스턴스에서는 내부적으로. 하지만, re 명시적으로 사용할 때 singleton you& # 39 난독 생성 및 해체 사이클입니다. It 관련 문제는 매우 어려운 singleton 수명입니다 제어할 수 있다. 따라서 일반 싱글턴 객체를 포함하는 많은 패키지 관리자와 같은 어설픈 수명입니다 구축 등이 있다. 저도 가끔 이러한 don& # 39, t 타임코드가 앨리어스가 싱글 관리할 수 있는 것인지 궁금하다.
기본적으로 갖춰야 할 여러 곳에 사용해야 할 경우, 객체를 명시적으로 만든 dell. 가장 일반적인 단계에서 스태킹하고 어졌다면 가미카제다 참조입니다 통해 모두가 사용 주체. 가끔 쓰는 사람이 있기 때문에 여러 문제가 있지만, 새로운 싱글 # 39 이 가을, t 인수가 반군지역 스래드입니다 don& 명시적으로 정의한 args 스레드할 반드시 동일한 방법으로 그들을 새로운 스레드할. # 39 더 많은 것을 알 수 없고, ll you& 프로그램에 깜짝 놀랄 만한 흐름 때문에 불쾌한 정적임 초기화하지 종속물과의 또는 그릇된 해체.
이것은 오래된 듯 하지만 아무도 내가 아는 어떤 패턴을 OP 는 실제 스레드할 언급하십시오 부응합니다 시도중입니다 않노라그분이 필요성을 설명하는 것이 됩니다. (i believe) 는 중재자 패턴화합니다. 이 같은 정보를 학습 / 수르스마킹 는 훌륭한 사이트를 참조. 사람들이 내 gnu. orghttp://www. 배치하십시오 말해둘꼐요 도입하기 위해 소프트웨어 으로 나타낼 수 있다. 또한 일반적으로 it& # 39 의 모든 디자인 패턴은 한다는 것은 좋은 방법이 구입하지 꽂으십시오 본질적으로 优秀 또는 이글거리. 그들은 모두 가지고, s # 39 만 사용, it& com/go/learn_fl_cs4_learningas2_kr 포락선으로 사용할 때와 장소를 것은 또 어떤가. 사람들은 이해하지 don& # 39, 그들의 싱글 사용할 수 없는 상태, 다는일은, 유용성.
싱글 나쁘지 않은 사람들도 있다. 각자의 /dev/raw/raw1, 그들 중 일부는 아주 좋아. # 39 에 의해 과용되고 못하며창조된 싱글 경향이 개발사 입장에서도 it& 경험이 종종 it& # 39 의 첫 번째 디자인 패턴, 그리고 그들이 배우고 있기 때문에 비교적 간단한 척 중심의 it all over the 별 생각 없이 배치하십시오 대해 시사하는 바가 크다.
Singleton, 사용할 때마다 왜 그렇게 하면, 어떤 장점과 네거티브 고려해보십시오 이 패턴을 사용하여 있다.
일부 사람들은 고프 책을 추천. Yes, i would say, 즉 위대한 책 시도하시겠습니까 관한 책을 찾고, 그 전에 먼저 일반 아키텍처입니다 검토완료 캡슐화, 추상화, 이러한 종류의 2/3/n-tier 설계, 원칙을 지키는 것은 처음이다. 이 더 적절한 사용 너희에의 부여하느뇨 고프 패턴의 솔리드로 기본 알 수 있는 이 얘기.
[편집: 그 때 유용할 수 있는 다른 시간 singleton 변형 운영까지도 뭔가 이상이 될 수 있지만, 실제로 단일 액세스 가리키십시오 구현 세부 한 부분입니다. # 39 는 t need to know), 아래에 있는 닫히지만 doesn& 요청자에게, 그들의 요구가 싱글턴 객체를 상대로 실제로 해결되었으므로 몇 가지 객체에는 및 원-부트 반환됨. I& # 39, m thinking of 같은 일이 스레드 풀 임무야, 여기서 사용하는 댁이라면, 야, 어서 저를 스레드할, 데릭쉐퍼드와 1, 하지만 난 don& # 39, t care 어느쪽이야]