[디자인 모델 공략] 생 성 모델 의 Singleton 모델 (Singleton 을 남용 하지 마 세 요)
GOF 가 제시 한 디자인 모델 중 가장 간단 하고 가장 많이 사용 하 는 모델 이 무엇 인지 말 하려 면 싱글 턴 모델 이 어야 한다.그것 의 실현 은 단지 하나의 Class 와 관련 되 고 이런 종류 로 그 자체 의 실례 화 를 책임 지 며 이 실례 화 는 유일한 요 구 를 만족 시 키 면 된다. 이렇게 간단 하 다.그러나 간단 하고 손 쉽게 사용 할 수 있 기 때문에 싱글 톤 모델 은 현재 가장 남용 되 기 쉬 운 모델 이다.뒷글 에 서 는 싱글 턴 남용 이 어떤 문 제 를 가 져 올 지 논의 할 예정 이다.
목적.
유일한 대상 만 실례 화하 고 전체 적 인 방법 을 제공 하여 그 대상 과 구성원 을 방문 하도록 한다.
실례
먼저 Singleton 의 실현 을 살 펴 보 겠 습 니 다. 간단 한 극, 하나의 클래스, 하나의 static 구성원, 하나의 private 구조 함수, 하나의 static Public 방법 으로 Singleton 을 실현 할 수 있 습 니 다. 코드 는 다음 과 같 습 니 다.
Class Singleton {
public:
static Singleton* get_instance() {
if (_instance == NULL) {
_instance = new Singleton;
}
return _instance;
}
// anything you want to be implemented
void do_something() {}
private:
Singleton() {}
static Singleton* _instance;
};
private 구조 함 수 는 new 를 통 해 대상 을 예화 하 는 것 을 방지 하 는 것 입 니 다. get인 스 턴 스 방법 은 싱글 톤 대상 을 방문 하 는 가장 전역 적 인 방법 입 니 다.사용 자 는 대상 을 어떻게 예화 하 는 지, 대상 을 어떻게 전달 하 는 지, 어떻게 호출 하 는 지, 인 스 턴 스 를 직접 얻 으 면 됩 니 다.
Singleton::get_instance()->do_something();
활용 단어 참조
처음부터 말 했 듯 이 Singleton 모델 은 가장 광범 위 하 게 사용 되 는 모델 중 하나 이다. 예 를 들 어 Logger 체제, Factory 류 의 실현 등 에서 Singleton 에 대한 사용 은 흔히 볼 수 있다.
싱글 턴 이 이렇게 간단 한데 왜 싱글 턴 모드 가 가장 많이 남용 되 는 모드 라 고 할 까?
우선 싱글 턴 을 언제 사용 해 야 할 지 논의 해 볼 까요?유일한 인 스 턴 스 대상 이 필요 할 때 싱글 턴 을 사용 하 는 것 을 고려 할 수 있다 는 것 은 잘 알려 져 있다.그러나 이것 은 필요 한 조건 일 뿐 이 므 로 다음 과 같은 문 제 를 분석 해 보 자.
1. 병발 과 라인 안전
Singleton 자 체 는 스 레 드 가 안전 하지만 Singleton 대상 의 실현 은 구체 적 인 기능 에 의존 하 는 것 입 니 다. 절대적 인 스 레 드 안전 이 아 닙 니 다. 예 를 들 어 위의 dosomething 방법의 실현.다 중 스 레 드 에서 Singleton 대상 을 동시에 사용 하여 호출 할 때 동기 화 보 호 를 고려 해 야 합 니 다. 동기 화 보 호 는 반드시 추가 비용 을 가 져 올 것 입 니 다. 프로그램 에서 전통 적 인 new 의 실례 화 다 중 대상 을 사용 하면 스 레 드 안전 문 제 를 해결 할 수 있 을 때 Singleton 을 사용 하 는 것 이 적당 한 지 고려 해 야 할 지도 모 릅 니 다.
2. 대상 수명 주기
하나의 대상 의 완전한 생명 주 기 는 소각 에 응용 할 때 까지 만들어 져 야 하 며, 싱글 톤 모델 의 전통 적 인 실현 은 대상 이 소각 하 는 과정 을 약화 시 켰 다. 그러면 프로그램 이 대상 의 완전한 생명 주 기 를 병행 해 야 할 때 싱글 톤 을 사용 하 는 것 은 어느 정도 문 제 를 가 져 왔 다.흔히 볼 수 있 는 문 제 를 들 어 싱글 턴 을 남용 한 후 가 져 온 직접적인 문 제 는 코드 를 발견 한 Unit testing 이 진행 되 지 않 는 이 유 는 무엇 입 니까?Unit testing 은 모든 test case 가 독립 된 과정 이 고 다른 test case 의 영향 을 받 지 않 는 다 고 강조 합 니 다. 이 는 모든 test case 가 대상 의 생 성에 서 소각 까지 관리 해 야 한 다 는 것 을 의미 합 니 다. 다음 test case 는 또 하나의 새로운 시작 이 될 것 을 보장 합 니 다. 싱글 턴 은 대상 을 소각 할 수 없 기 때문에 현재 test case 가 실 행 된 후 Singleton 대상 의 상태 에 대한 변 화 를 다음 test case 로 가 져 갑 니 다.이런 상황 에서 싱 턴 을 사용 해 야 하 는 지, 싱 턴 을 사용 해 야 하 는 지, 어떤 것 이 싱 턴 에 적합 하지 않 은 지 고려 해 볼 필요 가 있다.
3. OOD
싱글 톤 은 어느 정도 대상 디자인 을 파괴 할 수 있다.일각 에 서 는 싱글 턴 이 OO 의 관점 에서 제 기 된 디자인 모델 인 데 왜 싱글 턴 이 OOD 를 파괴한다 고 말 할 까?사실 우 리 는 싱글 톤 의 사용 방식 을 자세히 고려 하여 전체적인 방법 으로 인 스 턴 스 를 얻 은 다음 에 관련 방법 을 직접 호출 합 니 다. 이런 방식 은 무엇 과 유사 합 니까?C 스타일 의 전역 함수 와 유사 합 니 다!그래서 많은 사람들 이 편리 함 을 추구 하고 Singleton 을 남용 하여 코드 에 위 에서 아래로 이 각종 Singleton 대상 을 가득 채 우 고 과정 을 대상 으로 하 는 사고방식 으로 돌아 가 OO 의 측면 에서 디자인 을 고려 하지 않 았 다.사실 제 습관 은 가장 바깥쪽 의 클래스 (노출 인 터 페 이 스 를 외부 에 사용) 를 사용 하 는 것 입 니 다. 그리고 이 클래스 가 유일 성 을 가 질 때 만 Singleton 을 사용 하 는 지 여 부 를 고려 하 는 것 입 니 다. 내부 처 리 는 최대한 적 게 사용 하거나 사용 하지 않 습 니 다. 왜냐하면 Singleton 은 클래스 와 클래스 간 의 관 계 를 갈 라 놓 고 동시에 Unit testing 의 진행 을 방해 하기 때 문 입 니 다.
4. 유일 성
싱글 턴 을 사용 할 때 이 대상 이 과거, 현재, 그리고 미래 만 이 유일한 것 이 라 고 자신 에 게 거듭 물 어보 세 요.지금 싱글 톤 을 사용 하면 앞으로 여러 인 스 턴 스 를 지원 하 는 데 많은 번 거 로 움 을 줄 수 있 기 때문이다.
지금도 싱글 톤 을 남용 할 수 있 습 니까?
싱글 톤 모드 자 체 는 문제 가 없습니다. 다만 우리 의 사용 에 문제 가 없 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.