23가지 디자인 모드(1) - 단일 모드

정의:


단례 모델은 흔히 사용하는 소프트웨어 디자인 모델이다.그것의 핵심 구조에는 단례라고 불리는 특수류만 포함되어 있다.단일 패턴을 통해 시스템의 한 종류가 하나의 실례만 있다는 것을 보장할 수 있다.즉, 하나의 클래스는 하나의 대상 실례만 있다.

특징:


1. 단일 예류는 하나의 실례만 있을 수 있다.2. 단일 예류는 반드시 스스로 자신의 유일한 예를 만들어야 한다.3. 단례류는 모든 다른 대상에게 이 실례를 제공해야 한다.

단일 예제 모드의 주요 특징:


1. 사유의 구조 방법
2. 자신의 실례를 가리키는 사유 정적 인용
3, 자신의 실례를 반환값으로 하는 정적 공유 방법

단일 예제 모드는 인스턴스 객체의 시기에 따라 두 가지로 나뉜다.


하나는 굶주림식 단례, 하나는 게으름뱅이 단례.
아사자식 단례는 단례류가 불러올 때 하나의 대상을 실례화하여 자신의 인용에 건네준다.게으름뱅이는 실례를 얻을 때 실례화 대상을 사용한다.
코드는 다음과 같습니다.

굶주린 사람

public class Singleton {  
    private static Singleton singleton = new Singleton();  
    private Singleton(){}  
    public static Singleton getInstance(){  
        return singleton;  
    }  
}

게으름뱅이

public class Singleton {  
    private static Singleton singleton;  
    private Singleton(){}  

    public static synchronized Singleton getInstance(){  
        if(singleton==null){  
            singleton = new Singleton();  
        }  
        return singleton;  
    }  
}

이중 잠금 형식:


단례 모델은 비교적 흔히 볼 수 있는 형식이 있는데 그것이 바로 이중 자물쇠의 형식이다.
public class Singleton{    
    private static volatile Singleton instance=null;    
    private Singleton(){        
    //do something
    }    
    public static  Singleton getInstance(){        
        if(instance==null){            
            synchronized(SingletonClass.class){                
                if(instance==null){
                    instance=new Singleton();
                }
            }
        }        
    return instance;
     }
}

이 모드는 동기화 내용을if 내부로 내려가 실행 효율을 높인다. 대상을 얻을 때마다 동기화할 필요가 없다. 첫 번째만 동기화할 수 있고 창설된 후에는 필요없다.
이런 모델에서 이중판단을 동기화하는 방식은 첫 번째 예에서 효율이 크게 향상되었다. 만약에 단층if판단이 서버가 허용하는 상황에서 100개의 라인이 있다고 가정하면 소모되는 시간은 100*(동기판단시간+if판단시간)이고 이중if판단을 하면 100의 라인은 동시if판단을 할 수 있고 이론적으로 소모되는 시간은 하나의if판단 시간일 뿐이다.
그래서 높은 병발 상황에 직면하고 게으름뱅이 모델을 사용한다면 가장 좋은 선택은 이중 판단과 동기화 방식이다.

단일 예제 모드의 이점:


1, 메모리에 하나의 대상만 있어 메모리 공간을 절약한다.
2, 잦은 삭제 대상 생성을 피하고 성능을 향상시킬 수 있다.
3. 공유 자원에 대한 다중 점용을 피한다.
4, 전역 액세스가 가능합니다.

단일 모드의 단점:


1, 확장이 어렵습니다. getInstance 정적 함수로 인해 하위 클래스의 실례를 생성할 수 없습니다.넓히려면, 그 종류를 다시 쓰는 수밖에 없다.
2. 스텔스 사용은 유형 구조가 뚜렷하지 않다.
3, 프로그램 메모리 유출을 초래하는 문제.

적용 장면:


단례 모델의 상기 장점 때문에 프로그래밍에서 사용하는 비교적 많은 디자인 모델이다.다음은 단일 예제 모드를 사용하는 장면입니다.
1, 자주 실례화하고 폐기해야 하는 대상.
2. 대상을 만드는 데 시간이 너무 많이 걸리거나 자원이 너무 많이 소모되지만 자주 사용하는 대상이다.
3. 자원 공유 상황에서 자원 조작 시 발생하는 성능이나 손실 등을 피한다
4. 자원을 통제하는 상황에서 자원 간의 상호 통신을 편리하게 한다.

단일 모드 고려 사항:


단일 클래스가 제공하는 방법으로만 단일 대상을 얻을 수 있으며 반사를 사용하지 마십시오. 그렇지 않으면 새로운 대상을 실례화할 것입니다.
단일 클래스의 대상과 클래스의 정적 인용을 끊는 위험한 동작을 하지 마십시오.
다중 스레드는 공유 자원을 한 번에 사용할 때 스레드 안전 문제에 주의해야 한다.

Java의 단일 예제 모드에 대한 몇 가지 일반적인 질문:


단례 모드의 대상은 장시간 jvm 쓰레기 수집기에 수집되지 않습니까?


단일 사례에서 정적 인용 대상의 연결을 인위적으로 끊지 않으면 jvm 쓰레기 수집기는 단일 대상을 회수하지 않습니다.
jvm 마운트 해제 클래스에 대한 판정 조건은 다음과 같습니다.
1, 이 클래스의 모든 실례는 이미 회수되었다. 즉, 자바 더미에 이 클래스의 어떠한 실례도 존재하지 않는다.
2, 클래스를 로드한 ClassLoader가 재확보되었습니다.
3, 이 클래스에 대응하는java.lang.Class 대상은 인용된 곳이 없습니다. 이 종류에 반사적으로 접근할 수 없습니다.
세 가지 조건이 모두 충족되어야만 jvm는 쓰레기를 수집할 때 하역 클래스를 제거할 수 있다.분명히 단일 클래스는 조건 1을 충족시키지 못하기 때문에 단일 클래스도 회수되지 않는다.

한 jvm에 여러 개의 단례가 나타날까요?


분포식 시스템, 여러 종류의 캐리어, 그리고 서열화된 상황에서 여러 개의 단례가 발생할 수 있다는 점은 의심할 여지가 없다.그러면 같은 jvm에서 단례가 생기지 않을까요?단일 예시로 제공된 getInstance () 방법을 사용하면 같은 단일 예시만 얻을 수 있으며, 반사 방식을 사용하지 않으면 새로운 단일 예시를 얻을 수 있습니다.
코드는 다음과 같습니다.
Class c = Class.forName(Singleton.class.getName());  
Constructor ct = c.getDeclaredConstructor();  
ct.setAccessible(true);  
Singleton singleton = (Singleton)ct.newInstance();

이렇게 하면 매번 실행할 때마다 새로운 단일 대상이 생길 것이다.따라서 단례 모델을 운용할 때 반사로 새로운 단례 대상을 만들지 않도록 주의해야 한다.

getInstance () 방법에서 동기화가 우세합니까? 아니면 필요한 블록만 동기화하는 것이 우세합니까?


잠금은 실례를 만들 때만 의미가 있고, 다른 때는 실례만 읽고 접근할 수 있기 때문에 필요한 블록만 동기화하는 성능이 더욱 좋고, 더 좋은 선택입니다.
단점: 처음 호출할 때만 두 개의 대상이 생성되고 동기화를 요구해야 합니다.일단singleton이null이 되지 않으면 시스템은 동기화 자물쇠 비용을 써서 얻는 것보다 잃는 것이 많다.

단례류는 계승될 수 있습니까


단례 실례 구조의 시기와 방식에 따라 단례 모델은 몇 가지로 나눌 수 있다.그러나 이러한 사유화 구조 함수를 통해 정적 방법으로 실례를 제공하는 단일 클래스는 계승을 지원하지 않는다.
이런 모델의 단례 실현은 모든 구체적인 단례 클래스 자체로 단례 실례를 유지하고 여러 개의 실례의 생성을 제한해야 한다.그러나 다른 일례를 실현하는 사고방식인 등록식 일례를 채택하여 일례가 계승에 대한 개방을 할 수 있다.

좋은 웹페이지 즐겨찾기