디자인 모드 학습 노트 (1) - 단일 모드

4461 단어
개술
하나의 클래스에 하나의 실례만 있고 전체적인 접근점을 제공하는 단일 모드
일반적으로 우리는 하나의 전역 변수를 하나의 대상에 접근시킬 수 있지만, 그것은 여러 개의 대상을 실례화하는 것을 방지할 수 없다.가장 좋은 방법은 클래스 자체가 그것을 유지하는 유일한 실례를 책임지도록 하는 것이다.이 클래스는 다른 실례가 만들어지지 않을 뿐만 아니라, 이 실례에 접근할 수 있는 방법을 제공할 수 있다.
이런 모델을 응용할 때, 단례 대상의 클래스는 반드시 하나의 실례만 존재할 것을 보장해야 한다.
 
2. 단일 모델 실현
2.1 단일 모드
단일 모델의 실현에는 주로 두 가지 방식이 있다. 하나는 방법을 호출할 때 실례화된 작업을 하는 것이다. 이런 방식을 게으름뱅이식이라고 한다.다른 방법은 클래스가 불러올 때 실례를 만드는 것이다. 이런 방식을 굶주림식이라고 부른다.
단일 모드를 실현하는 사고방식: 개인 대상의 인용(영원히 동일)과 이 실례를 가져오는 방법(정적 방법이어야 하며 getInstance라는 방법명을 사용합니다)을 정의한다.우리가 이 방법을 호출할 때, 클래스가 가지고 있는 인용이 비어 있지 않으면 이 인용을 되돌려주고, 클래스가 유지하고 있는 인용이 비어 있으면 클래스의 실례를 만들고, 실례의 인용을 클래스가 유지하고 있는 인용에 부여한다.또한 우리는 이 클래스의 구조 함수를 사유 방법으로 정의하여 다른 부분의 코드는 이 클래스의 구조 함수를 호출하여 이 클래스의 실체 대상을 실례화할 수 없고, 이 클래스가 제공하는 정적 방법으로만 이 클래스의 유일한 실례를 얻을 수 있다.
 
2.2 게으름뱅이 모드
게으름뱅이식으로 이루어진 단일 모드에서 대상을 만드는 실례 코드 중 하나가null인지 아닌지를 판단하는 경우가 있다. 만약에 다중 루트 상황에서 루트 A가 이 방법체에 들어갔을 때 쌍선이null인 것을 발견하면 이 종류의 실례가 만들어지고 다른 루트 B도 루트 A와 함께 이 방법체에 들어간다. 루트 V 검사 대상이null인지 아닌지를 검사할 때 대상이null인 것을 얻어낸다.그러면 라인 B도 하나의 유형의 실례를 만들 수 있다. 그러면 이 종류가 게으름뱅이식의 실현에 여러 가지 실례가 발생할 수 있다.그러나 방법체에 동기화 자물쇠를 달면 이 라인의 안전 문제를 해결할 수 있다.
public class Demo1 {
    
    private static Demo1 obj = null;
    
    private Demo1() {
        
    }
    
    //  (synchronized),  
    public synchronized static Demo1 getInstance() {
        if (obj == null) {
            obj = new Demo1();
        }
        return obj;
    }
    
}

장점: 대상이 없는 상황에서 실례를 만드는 것을 피하고 자원 이용률이 높으며 getInstance 방법을 실행하지 않으면 실례가 되지 않습니다.
단점: 여러 라인이 동시에 접근하는 상황에서 여러 개의 실례를 동시에 만들 수 있지만 여러 개의 실례는 같은 대상이 아니다. 뒤에 만든 실례는 이전에 만든 실례를 덮어쓰지만 다른 대상을 얻는 경우가 존재한다.이 문제를 해결하는 것은synchronized를 잠그는 것이다.처음 불러올 때 속도가 늦어지고, 다중 스레드는 불필요한 동기화 비용이 많이 든다.
    
2.3 굶주린 사람 모드
굶주린 사람은 클래스 단계에서 전체 국면의 정적 변수를 정의하고 이 클래스의 대상을 즉시 실례화하여 이 변수에 값을 부여한다. 그러나 이 클래스를 되돌리는 정적 방법에서 이 전체 국면 변수를 되돌려주면 된다. 변수가null인지 판단할 필요가 없다.
public class Demo2 {

    //  
    private static Demo2 obj = new Demo2();
    
    private Demo2() {
        
    }
    
    public static Demo2 getInstance() {
        return obj;
    }
}

장점: 라인 안전;클래스를 불러오는 동시에 정적 대상을 만들었습니다. 호출 반응 속도가 빠릅니다.
단점: 자원 효율이 높지 않습니다. getInstance 방법은 영원히 실행되지 않을 수도 있지만, 이 클래스를 실행하는 다른 정적 방법이나 클래스를 불러오면 이 실례는 초기화됩니다.
 
3. 총결산
굶주린 사람과 게으른 사람의 차이:
1. 스레드 보안:
굶주림식은 라인이 안전해서 다중 라인에 직접 사용할 수 있어 문제가 생기지 않는다. 게으름뱅이는 안 된다. 이것은 라인이 안전하지 않다. 만약에 다중 라인에 사용하면 여러 번 실례화되어 일례적인 역할을 잃을 수 있다. 만약에 게으름뱅이를 다중 라인에 사용하려면 두 가지 방식으로 안전성을 확보해야 한다. 하나는 getInstance 방법에 동기화를 더하고 다른 하나는 이 방법의 앞뒤에 자물쇠를 잠그는 것이다.
2. 자원 로드:
굶주린 사람은 클래스를 만드는 동시에 정적 대상을 실례화한다. 이후에 이 단례를 사용하든 안 사용하든 일정한 메모리를 차지하고 그에 상응하는 호출 속도도 더욱 빠르다.게으름뱅이식 고명 사상은 적재를 지연시켜 이 단례를 처음 사용할 때 실례화 대상에게 온다. 처음 호출할 때 초기화해야 한다. 일을 많이 하면 성능이 좀 늦어지고 나중에 굶주린 사람과 같다.
 
적용 범위:
자원을 많이 소모하는 대상 만들기 (예를 들어 큰 파일 읽기)
자원 생성이 비교적 비싸다(데이터베이스 연결보다)
단지 하나의 대상만 존재할 때
  
전재 대상:https://www.cnblogs.com/hejianliang/p/9099351.html

좋은 웹페이지 즐겨찾기