[Java 디자인 모드] 단일 모드

3145 단어 java 디자인 모드

소개하다.


단례 모델은 흔히 사용하는 소프트웨어 디자인 모델로 그 정의는 단례 대상의 클래스가 하나의 실례만 존재할 수 있도록 허용하는 것이다.
많은 경우 전체 시스템은 하나의 전체적인 대상만 가지면 시스템 전체의 행위를 조율하는 데 유리하다.예를 들어 어떤 서버 프로그램에서 이 서버의 설정 정보는 하나의 파일에 저장되고 이러한 설정 데이터는 하나의 단일 대상이 통일적으로 읽은 다음에 서비스 프로세스의 다른 대상이 이 단일 대상을 통해 이러한 설정 정보를 얻는다.이런 방식은 복잡한 환경에서 배치 관리를 간소화시켰다.
For example, 바로 하나의 왕국(Kingdom) 안에 한 명의 왕(King)만 있어야 하고, 매번 왕을 호출할 때마다 같은 왕이어야 한다.

기본적인 실현 방향


하나의 클래스에 대해 매번 하나의 실례만 있을 수 있습니다. 이것은 하나의 예시 모드에서 클래스가 대상의 인용 (영원히 같은 것) 과 이 실례를 얻을 수 있는 방법 (정적 방법이어야 합니다. 보통 getInstance라는 이름을 사용합니다.) 을 되돌려 주어야 합니다.
단일 사례의 실현은 주로 다음과 같은 두 가지 절차를 거친다.
  • 이 클래스의 구조 방법을 사유 방법으로 정의하면 다른 곳의 코드는 이 클래스의 구조 방법을 호출하여 이 클래스의 대상을 실례화할 수 없고 이 클래스가 제공한 정적 방법을 통해 이 클래스의 유일한 실례를 얻을 수 있다.
  • 이 클래스에 정적 방법을 제공합니다. 이 방법을 호출할 때, 클래스가 가지고 있는 인용이 비어 있지 않으면 이 인용을 되돌려주고, 클래스가 비어 있으면 이 클래스의 실례를 만들고, 실례의 인용을 클래스가 가지고 있는 인용에 부여합니다.

  • 일반적인 실현 방식


    굶주리다

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

     
    그럼요. 이것도 정적 코드 블록을 쓸 수 있어요.

    2 게으름뱅이식(이중 검사)

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

      

    3 정적 내부 클래스

    public class Singleton {
    
    
    
        private Singleton() {}
    
        
    
        private static class SingletonInstance {
    
            private static final Singleton INSTANCE = new Singleton();
    
        }
    
    
    
        public static Singleton getInstance() {
    
            return SingletonInstance.INSTANCE;
    
        }
    
    }

    이런 방식은 굶주린 사람식 방식이 채택한 메커니즘과 유사하지만 또 다르다.둘 다 클래스 마운트 메커니즘을 사용해서 초기화 실례가 하나의 라인만 있을 수 있도록 보장한다.다른 점은 아사자식 방식은 싱leton류가 적재되면 실례화되고 레이지-Loading의 작용이 없으며 정적 내부 클래스는 싱leton류가 적재될 때 즉각 실례화되지 않고 실례화가 필요할 때 getInstance 방법을 호출해야 싱letonInstance류를 적재하여 싱leton의 실례화를 완성할 수 있다.
    클래스의 정적 속성은 클래스를 처음 불러올 때만 초기화됩니다. 따라서 여기서 JVM은 루트의 안전성을 확보하고 클래스를 초기화할 때 다른 루트는 들어갈 수 없습니다.
    장점: 라인이 안전하지 않고 적재 지연을 피하며 효율이 높습니다.
     

    4 매거

    public enum Singleton {
    
        INSTANCE;
    
        public void whateverMethod() {
    
            
    
        }
    
    }

    JDK1의 도움을 받다.5에 추가된 매거진으로 단일 모드를 실현합니다.다중 루틴 동기화 문제를 피할 수 있을 뿐만 아니라, 새로운 대상을 반서열화하는 것도 방지할 수 있다.JDK1에 일일이 들었기 때문일 수도 있어요.5에 첨가되기 때문에 실제 프로젝트 개발에서 이렇게 쓴 적이 드물다.
    장점
    시스템 메모리에 이 클래스는 하나의 대상만 존재하기 때문에 시스템 자원을 절약하고 자주 폐기해야 하는 대상에 대해 단일 모드를 사용하면 시스템 성능을 향상시킬 수 있다.
    결점
    하나의 단일 클래스를 실례화하려면 new를 사용하지 않고 대상을 얻는 방법을 기억해야 한다. 특히 원본을 볼 수 없을 때.
     
    적용 장소
  • 빈번하게 창설하고 소각해야 하는 대상;
  • 대상을 만드는 데 시간이 너무 많이 걸리거나 자원이 너무 많이 소모되지만 자주 사용하는 대상;
  • 도구류 대상;
  • 데이터베이스나 파일에 빈번하게 접근하는 대상.
  • 좋은 웹페이지 즐겨찾기