Head First 디자인 모드 노트 4. 단일 모드
11243 단어 Head퍼스트 디자인 모드디자인 모드소프트웨어 구조
단일 모드 는 하나의 인 스 턴 스 만 있 고 전체 방문 점 을 제공 합 니 다.
무슨 소 용이 있 습 니까?많은 대상 이 하나 밖 에 없다. 예 를 들 어 작업 관리자, 파일 등 이다.만약 여러 명의 대상 이 있다 면 버그 가 나타 날 것 이다.
그렇다면 전역 정적 변 수 를 이용 하여 단일 대상 을 실현 하 는 것 은 어 떻 습 니까?
단일 모드 의 실현
구조 함수 접근 을
private
로 설계 하면 어떻게 됩 니까?다음 과 같은 코드public class Myclass{
private Myclass(){
};
}
이런 종 류 는 실례 화 될 수 있 습 니까?
구조 함수 가
private
로 설정 되 어 있 기 때문에 이러한 인 스 턴 스 만 호출 할 수 있 지만 구조 함수 없 이 대상 을 예화 할 수 없다 는 것 이 분명 하 다.우 리 는 이 구조 함 수 를 호출 하기 위해 정적 함 수 를 하나 더 추가 했다.
public class Myclass{
private Myclass(){
}
public static Myclass getInstance(){
return new Myclass();
}
}
이렇게 하면 이 종 류 를 예화 할 수 있 고 조금 만 수정 하면 한 번 만 예화 할 수 있 는 종 류 를 얻 을 수 있다.
게으름뱅이
// NOTE: This is not thread safe!
public class Singleton {
private static Singleton uniqueInstance;
// ,
private Singleton() {
}
public static Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
그러나 이렇게 하 는 것 은 결코 안전 한 것 이 아니다.여러 스 레 드 접근
getInstance()
방법 이 있 을 때 여러 대상 을 실례 화 할 수 있 습 니 다.게으름뱅이 식, 스 레 드 안전
거 친 해결 방법 에 우 리 는
getInstance()
방법 에 synchronized
키 워드 를 더 했다.public class Singleton {
private static Singleton uniqueInstance;
// ,
private Singleton() {
}
public static synchronized Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
그러나 실제로 우 리 는 첫 번 째 호출
getInstance()
만 동기 화 되 어야 동기 화 되 고 동기 화 를 더 하면 불필요 한 효율 이 떨어진다.만약 getInstance()
방법 이 빈번하게 호출 되 어야 한다 면 효율 을 크게 떨 어 뜨 릴 것 이다.굶 주 린 사람 식, 스 레 드 안전
대상 을 만 드 는 데 소모 가 많 지 않다 면 초기 화 할 때 대상 을 예화 하 는 것 을 고려 할 수 있 습 니 다.아래 와 같다
public class Singleton {
private static Singleton uniqueInstance = new Singleton();
// ,
private Singleton() {
}
public static Singleton getInstance() {
return uniqueInstance;
}
}
초기 화 할 때 단일 사례 를 직접 예화 하 는 이러한 실현 방식 을 우 리 는 '굶 주 린 식' 이 라 고 부 르 는데 주로 대상 이 빈번하게 만 들 어 졌 고 소모 가 크 지 않 은 상황 을 만 드 는 데 사용 된다.이에 대응 하 는 앞의 것 은 사용 할 때 까지 하나의 실현 방식 을 '게으름뱅이 식' 이 라 고 부른다.
이중 검사 자물쇠.
그러면 단일 창설 의 소모 가 비교적 크 고 창설 이 빈번 할 수도 있 고 창설 되 지 않 을 수도 있 습 니 다. 어떻게 해 야 합 니까?
synchronized
수식 방법 을 사용 하면 동기 화로 인해 불필요 한 성능 이 떨 어 지고, 굶 주 린 한식 창설 방식 으로 초기 화 대상 을 실례 화 할 수 있 으 며, 이 대상 은 실례 화 되 지 않 았 을 수도 있다.이중 검사 자 물 쇠 는 우리 가 이 문 제 를 해결 하 는 데 도움 을 줄 수 있다.대상 이 생 성 되 었 는 지 확인 할 수 있 습 니 다. 생 성 되 지 않 았 다 면 동기 화 할 수 있 습 니 다.
//
// Danger! This implementation of Singleton not
// guaranteed to work prior to Java 5
//
public class Singleton {
private volatile static Singleton uniqueInstance;
// volatile uniqueInstance ,
private Singleton() {
}
public static Singleton getInstance() {
if (uniqueInstance == null) {
// ,
synchronized (Singleton.class) {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
교묘 한 방법 으로 안 타 깝 게 도 1.4 버 전의 이전 자바 버 전에 서 는 수식 자 를 지원 하지 않 는 다
volatile
.그 러 니까 쓸 때 자바 버 전 조심 하 세 요.단일 모드 의 어두 운 면
단일 모드 를 사용 하 는 클래스 는 계승 할 수 없습니다. 구조 함수
private
가 수식 되 어 확장 할 수 없 기 때 문 입 니 다.그러나 privata
을 protected
로 바 꾸 면 또 하나의 모델 을 파괴 하고 다른 유형 도 예화 할 수 있다.만약 하나의 디자인 이 단가 모델 을 대량으로 사용 했다 면 문제 가 있 을 가능성 이 높다.일반적인 상황 에서 사용 장소 가 많 지 않 기 때문이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Head First 디자인 모델 의 관찰자 모델관찰자 모드: 게시 - 구독 모드 라 고도 합 니 다.게시 자의 데이터 가 바 뀌 었 을 때 모든 구독 자 에 게 변 화 를 알려 야 합 니 다.신문 구독 과 비슷 하 게 신문 사 는 게시 자 이 고 독 자 는 구독...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.