안 드 로 이 드 개발 디자인 모델 의 단일 모델

9158 단어

단일 모델 은 디자인 모델 에서 가장 흔히 볼 수 있 고 가장 간단 한 디자인 모델 로 프로그램 에 하나의 인 스 턴 스 만 존재 하고 전체적인 방문 을 확보 했다.예 를 들 어 안 드 로 이 드 의 실제 앱 개발 에 사용 되 는 계 정 정보 대상 관리, 데이터베이스 대상 (SQLiteOpenHelper) 등 은 모두 단일 모델 을 사용한다.다음은 몇 가지 예 를 들 어 우리 가 개발 과정 에서 단일 모델 을 응용 할 때 주의해 야 할 점 을 분석한다.
1. 역할 단일 예 모드 (Singleton): 하나의 인 스 턴 스 만 있 고 전체 방문 점 을 제공 합 니 다.
2. 적용 장면
1. 응용 프로그램 에서 인 스 턴 스 대상 이 자주 방문 해 야 합 니 다.
2. 응용 프로그램 에서 시작 할 때마다 하나의 인 스 턴 스 만 존재 합 니 다.예 를 들 어 계 정 시스템, 데이터베이스 시스템.
3. 자주 사용 하 는 사용 방식
(1) 게으름뱅이 식
이것 은 개발 과정 에서 쉽게 쓸 수 있 는 방식 으로 다음 과 같다.
[java] view plain copy print ?
public class Singleton {  
  •   

  •     /* 개인 정적 인 스 턴 스 를 가지 고 있 습 니 다. 인용 되 는 것 을 방지 합 니 다. 이 곳 에 값 을 null 로 할당 하 는 것 은 로드 지연 을 실현 하 는 것 입 니 다. */  
  •     private static Singleton instance = null;  

  •   
  •     /* 사유 구조 방법 이 실례 화 되 는 것 을 방지 하 다 */  

  •     private Singleton() {  
  •     }  

  •   
  •     /* 1: 게으름뱅이 식, 정적 공정 방법, 인 스 턴 스 생 성 */  

  •     public static Singleton getInstance() {  
  •         if (instance == null) {  

  •             instance = new Singleton();  
  •         }  

  •         return instance;  
  •     }  

  • }  
    public class Singleton {
    
        /*         ,     ,     null,          */
        private static Singleton instance = null;
    
        /*       ,       */
        private Singleton() {
        }
    
        /* 1:   ,      ,     */
        public static Singleton getInstance() {
            if (instance == null) {
                instance = new Singleton();
            }
            return instance;
        }
    }
    호출:
    [java] view plain copy print ?
    Singleton.getInstance().method();  
    Singleton.getInstance().method();
    장점: 로 딩 지연 (필요 할 때 만 로 딩)
    단점: 스 레 드 가 안전 하지 않 습 니 다. 다 중 스 레 드 에서 동기 화 되 지 않 는 상황 이 발생 하기 쉽 습 니 다. 예 를 들 어 데이터베이스 대상 이 자주 읽 기와 쓰기 작업 을 할 때.
    (2) 동기 화 자물쇠 추가
    스 레 드 가 안전 하지 않 은 이상 동기 화 자 물 쇠 를 추가 합 니 다. 하나의 덧셈 은 다음 과 같 습 니 다.
    [java] view plain copy print ?
    / * 2. 게으름뱅이 변종, 스 레 드 안전 문제 해결 * * /  
  •  public static synchronized Singleton getInstance() {  

  •      if (instance == null) {  
  •          instance = new Singleton();  

  •      }  
  •      return instance;  

  •  }  
       /*2.     ,        **/
        public static synchronized Singleton getInstance() {
            if (instance == null) {
                instance = new Singleton();
            }
            return instance;
        }
    더 일반적인 문법 은 이렇다
    [java] view plain copy print ?
    / * synchronized 를 추가 하지만 인 스 턴 스 를 호출 할 때마다 불 러 옵 니 다 * * /  
  •  public static Singleton getInstance() {  

  •      synchronized (Singleton.class) {  
  •          if (instance == null) {  

  •              instance = new Singleton();  
  •          }  

  •      }  
  •      return instance;  

  •  }  
       /*  synchronized,             **/
        public static Singleton getInstance() {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
            return instance;
        }
    호출:
    [java] view plain copy print ?
    Singleton.getInstance().method();  
    Singleton.getInstance().method();
    장점: 라인 이 안전 하지 않 은 문 제 를 해결 했다.
    단점: 효율 이 낮 아 호출 할 때마다 동기 화 잠 금 을 판단 해 야 합 니 다.
    보충: 안 드 로 이 드 소스 코드 에서 사용 하 는 이 방법 은 InputMethodManager, Accessibility Manager 등 이 있 습 니 다.
    (3) 이중 검사 자물쇠
    최적화 (2) 에서 매번 인 스 턴 스 를 호출 할 때마다 동기 화 잠 금 문 제 를 판단 해 야 하기 때문에 많은 사람들 이 아래 의 이중 판단 검증 방법 을 사용한다.
    [java] view plain copy print ?
    / * 3. 이중 잠 금: 처음 초기 화 할 때 만 동기 잠 금 추가 * /  
  •   public static Singleton getInstance() {  

  •       if (instance == null) {  
  •           synchronized (Singleton.class) {  

  •               if (instance == null) {  
  •                   instance = new Singleton();  

  •               }  
  •           }  

  •       }  
  •       return instance;  

  •   }  
      /*3.    :                */
        public static Singleton getInstance() {
            if (instance == null) {
                synchronized (Singleton.class) {
                    if (instance == null) {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    이런 방법 은 상기 효율 적 인 문 제 를 완벽 하 게 해결 한 것 같다. 병발 량 이 많 지 않 고 안전성 이 높 지 않 은 상황 에서 완벽 하 게 운행 할 수 있 을 지도 모 르 지만 이런 방법 도 불행 한 점 이 있다. 문 제 는 바로 이 말 에 나타난다.
    [java] view plain copy print ?
    instance = new Singleton();  
     instance = new Singleton();

    JVM 컴 파일 과정 에서 명령 정렬 의 최적화 과정 이 나타 날 수 있 습 니 다. 이 로 인해 인 스 턴 스 가 실제로 초기 화 되 지 않 았 을 때 메모리 공간 이 분 배 될 수 있 습 니 다. 즉, instance! = null 이지 만 초기 화 되 지 않 은 경우 가 발생 합 니 다. 그러면 되 돌아 갈 수 있 습 니 다. instance 가 완전 하지 않 음 (참고 가능:http://www.360doc.com/content/11/0810/12/1542811_139352888.shtml)。
    호출:
    [java] view plain copy print ?
    Singleton.getInstance().method();  
    Singleton.getInstance().method();
    장점: 병발 량 이 많 지 않 고 안전성 이 높 지 않 은 상황 에서 단일 모드 를 완벽 하 게 실행 할 수 있 습 니 다.
    단점: 서로 다른 플랫폼 의 컴 파일 과정 에서 심각 한 안전 위험 이 존재 할 수 있 습 니 다.
    추가: 안 드 로 이 드 이미지 오픈 소스 프로젝트 안 드 로 이 드 - 유 니 버 설 - 이미지 - 로 더 (https://github.com/nostra13/Android-Universal-Image-Loader) 에서 사용 하 는 것 은 이런 방식 이다.
    (4) 내부 류 의 실현
    내부 클래스 는 좋 은 실현 방식 이 므 로 추천 할 수 있 습 니 다.
    [java] view plain copy print ?
    public class SingletonInner {  
  •   

  •     /** 
  •      * 내부 클래스 구현 단일 모드 

  •      * 로드 지연, 메모리 비용 감소 
  •      *  

  •      * @author xuzhaohu 
  •      *  

  •      */  
  •     private static class SingletonHolder {  

  •         private static SingletonInner instance = new SingletonInner();  
  •     }  

  •   
  •     /** 

  •      * 개인 구조 함수 
  •      */  

  •     private SingletonInner() {  
  •   

  •     }  
  •   

  •     public static SingletonInner getInstance() {  
  •         return SingletonHolder.instance;  

  •     }  
  •   

  •     protected void method() {  
  •         System.out.println("SingletonInner");  

  •     }  
  • }  
  • public class SingletonInner {
    
        /**
         *          
         *     ,      
         * 
         * @author xuzhaohu
         * 
         */
        private static class SingletonHolder {
            private static SingletonInner instance = new SingletonInner();
        }
    
        /**
         *        
         */
        private SingletonInner() {
    
        }
    
        public static SingletonInner getInstance() {
            return SingletonHolder.instance;
        }
    
        protected void method() {
            System.out.println("SingletonInner");
        }
    }

    호출:
    [java] view plain copy print ?
    SingletonInner.getInstance().method();  
    SingletonInner.getInstance().method();
    장점: 로 딩 지연, 스 레 드 안전 (자바 에서 class 로 딩 시 서로 배척 하 는), 메모리 소모 도 감소 합 니 다.
    (5) 매 거 진 방법
    이것 은 인터넷 에서 많은 사람들 이 추천 하 는 방법 이지 만 널리 사용 되 지 않 는 것 같 으 니 한번 해 보 세 요.
    [java] view plain copy print ?
    /** 
  •  * @function: 단일 모드 매 거 진 실현 

  •  * @author xuzhaohu 
  •  *  

  •  */  
  • public enum SingletonEnum {  

  •     /** 
  •      * 1. 자바 1.5 부터 지원 합 니 다. 

  •      * 2. 직렬 화 체 제 를 무상 으로 제공한다. 
  •      * 3. 여러 번 의 실례 화 를 절대적 으로 방지 하고 복잡 한 서열 화 나 반사 공격 에 직면 하 더 라 도 

  •      */  
  •   

  •     instance;  
  •   

  •     private String others;  
  •   

  •     SingletonEnum() {  
  •   

  •     }  
  •   

  •     public void method() {  
  •         System.out.println("SingletonEnum");  

  •     }  
  •   

  •     public String getOthers() {  
  •         return others;  

  •     }  
  •   

  •     public void setOthers(String others) {  
  •         this.others = others;  

  •     }  
  • }  
  • /**
     * @function:        
     * @author xuzhaohu
     * 
     */
    public enum SingletonEnum {
        /**
         * 1. Java1.5    ;
         * 2.         ;
         * 3.         ,                    ;
         */
    
        instance;
    
        private String others;
    
        SingletonEnum() {
    
        }
    
        public void method() {
            System.out.println("SingletonEnum");
        }
    
        public String getOthers() {
            return others;
        }
    
        public void setOthers(String others) {
            this.others = others;
        }
    }

    호출:
    [java] view plain copy print ?
    SingletonEnum.instance.method();  
    SingletonEnum.instance.method();
    장단 점: 예 를 들 어 코드 에 주석 이 있 습 니 다.
    위 에 서 는 주로 단일 모델 5 가지 생 성 방법 을 설명 하 였 으 며, 여러분 은 그 장단 점 에 따라 개인 실제 프로젝트 에서 사용 할 수 있 습 니 다. 벽돌 을 던 져 옥 을 끌 어 올 리 는 것 에 속 하 므 로 의견 을 많이 제시 하 시기 바 랍 니 다.

    좋은 웹페이지 즐겨찾기