Android 단일 모드 싱글 톤 간단 한 인 스 턴 스 디자인 모델 분석

단일 모드 싱글 톤 간단 한 인 스 턴 스 디자인 모델 분석
머리말
오늘 은 안 드 로 이 드 개발 에서 가장 많이 사용 되 는 디자인 모델 인 단일 모델 을 전면적으로 정리 하 겠 습 니 다.
디자인 모델 에 대한 소 개 는 제 가 전에 쓴 것 을 볼 수 있 습 니 다.1 분 동안'디자인 모델'을 전면적으로 이해 할 수 있 습 니 다.
목차
这里写图片描述
1.도입
1.1 어떤 문 제 를 해결 하 는가
전에 말 했 듯 이 디자인 모델=특정한 문제 의 해결 방안,그러면 단일 모델 은 어떤 문 제 를 해결 하 는 해결 방안 입 니까?
의미:단일 예=하나의 인 스 턴 스;
해결 문제:대상 간 결합 도 낮 추기
해결 방법:하나의 사례 모델,즉 하나의 사례 화 대상 만 실현 하고 전체적인 방문 점 을 제공 하 는 것 입 니 다.
1.2 인 스 턴 스 도입
다음 에 나 는 하나의 사례 로 단일 모델 을 도입 할 것 이다.
배경:소성 은 플라스틱 생산 공장 이 있 지만 안에 창고 가 하나 밖 에 없어 요.
목적:코드 로 창고 관 리 를 실현 하고 싶 습 니 다.
기 존 방법:창고 류 와 노동자 류 구축
그 중에서 창고 류 의 quantity=상품 수량;노동자 류 에는 운반 방법 인 Movein(int i)과 MoveOut(int i)이 있다.
문제 발생:테스트 를 통 해 매번 노동자 들 이 운반 작업 을 할 때마다 창 고 를 새로 짓 는 다 는 것 을 알 수 있 습 니 다.바로 화물 이 같은 창고 에 두 지 않 는 다 는 것 입 니 다.이것 은 어떻게 된 일 입 니까?코드 보기)

package scut.designmodel.SingletonPattern;


//   
class StoreHouse {
  private int quantity = 100;

  public void setQuantity(int quantity) {
    this.quantity = quantity;
  }

  public int getQuantity() {
    return quantity;
  }
}

//     
class Carrier{
  public StoreHouse mStoreHouse;
  public Carrier(StoreHouse storeHouse){
    mStoreHouse = storeHouse;
  }
  //     
  public void MoveIn(int i){
    mStoreHouse.setQuantity(mStoreHouse.getQuantity()+i);
  }
  //     
  public void MoveOut(int i){
    mStoreHouse.setQuantity(mStoreHouse.getQuantity()-i);
  }
}

//      
public class SinglePattern {
  public static void main(String[] args){
    StoreHouse mStoreHouse1 = new StoreHouse();
    StoreHouse mStoreHouse2 = new StoreHouse();
    Carrier Carrier1 = new Carrier(mStoreHouse1);
    Carrier Carrier2 = new Carrier(mStoreHouse2);

    System.out.println("        ?");

    if(mStoreHouse1.equals(mStoreHouse2)){//   equals     ==   ,   ==              
      System.out.println("    ");
    }else {
      System.out.println("     ");
    }
    //                   
    Carrier1.MoveIn(30);
    System.out.println("      :"+Carrier1.mStoreHouse.getQuantity());
    Carrier2.MoveOut(50);
    System.out.println("      :"+Carrier2.mStoreHouse.getQuantity());
  }
}
결과:

        ?
     
      :130
      :50
2.단일 모델 소개
2.1 해결 하 는 문제(응용 장면)
충돌:위의 결 과 를 통 해 알 수 있 듯 이 노동자 류 가 같은 창고 의 인 스 턴 스 가 아 닙 니 다.
목표:모든 작업 자 는 같은 창고 인 스 턴 스 를 작 동 합 니 다.
단일 사례 모델 은 이러한 문 제 를 해결 하기 위 한 해결 방안 이다.하나의 사례 화 대상 만 실현 하고 전체적인 방문 점 2.2 작업 원 리 를 제공 하 는 것 이다.
자바 에서 우 리 는 사용 대상(클래스 실례 화 후)을 통 해 이러한 클래스 를 조작 합 니 다.클래스 실례 화 는 그 구조 방법 을 통 해 이 루어 집 니 다.만약 에 하나의 클래스 만 실례 화 대상 을 실현 하려 면 클래스 의 구조 방법 에 공 을 들 여야 합 니 다.
这里写图片描述
단일 모드 의 일반적인 실현:(사용 절차 포함)

public class Singleton {
//1.        ourInstance(     Singleton      )
//2.        
  private static Singleton ourInstance = new Singleton();

//3.           ,             
  private Singleton() {
  }
//4.                   
//5.       getInstance()          
  public static Singleton newInstance() {
    return ourInstance;
  }
}
자,단일 모델 의 소개 와 원 리 는 알 겠 지?그럼 위 에 있 는 작은 성 이 가 나타 난'창고 가 하나 가 아니 야'문 제 를 해결 해 보 자!
2.3 사례 소개
소성 은 단일 모드 를 사용 하여 상기 예 의 코드 를 개선 합 니 다.

package scut.designmodel.SingletonPattern;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

//     
class StoreHouse {

  //      
  private int quantity = 100;
  //        
  private static StoreHouse ourInstance = new StoreHouse();;
  //       getInstance()          。
  public static StoreHouse getInstance() {
    return ourInstance;
  }

  //      
  private StoreHouse() {
  }

  public void setQuantity(int quantity) {
    this.quantity = quantity;
  }

  public int getQuantity() {
    return quantity;
  }
}


//     
class Carrier{
  public StoreHouse mStoreHouse;
  public Carrier(StoreHouse storeHouse){
    mStoreHouse = storeHouse;
  }
  //     
  public void MoveIn(int i){
    mStoreHouse.setQuantity(mStoreHouse.getQuantity()+i);
  }
  //     
  public void MoveOut(int i){
    mStoreHouse.setQuantity(mStoreHouse.getQuantity()-i);
  }
}

//      
public class SinglePattern {
  public static void main(String[] args){
    StoreHouse mStoreHouse1 = StoreHouse.getInstance();
    StoreHouse mStoreHouse2 = StoreHouse.getInstance();
    Carrier Carrier1 = new Carrier(mStoreHouse1);
    Carrier Carrier2 = new Carrier(mStoreHouse2);

    System.out.println("        ?");

    if(mStoreHouse1.equals(mStoreHouse2)){
      System.out.println("    ");
    }else {
      System.out.println("     ");
    }
    //                   
    Carrier1.MoveIn(30);
    System.out.println("      :"+Carrier1.mStoreHouse.getQuantity());
    Carrier2.MoveOut(50);
    System.out.println("      :"+Carrier2.mStoreHouse.getQuantity());
  }
}
결과:

        ?
    
      :130
      :80
결과 분석 에 따 르 면 단일 모델 을 사용 한 후에 창고 류 는 하나의 창고 인 스 턴 스 만 있 습 니 다.더 이상 짐꾼 이 창고 에 잘못 들 어 갈 염려 가 없습니다!!
2.4 장점
4.567917.유일한 인 스 턴 스 에 대한 제어 접근 을 제공 합 니 다4.567917.시스템 메모리 에 하나의 대상 만 존재 하기 때문에 시스템 자원 을 절약 할 수 있 고 자주 만 들 고 소각 해 야 하 는 대상 의 단일 모델 에 대해 시스템 의 성능 을 향상 시 킬 수 있다4.567917.실제 상황 의 수요 에 따라 단일 모델 을 바탕 으로 두 가지 모델,여러 가지 모델 을 확대 할 수 있다2.5 단점
4.567917.사례 류 의 직책 이 너무 무 겁 고 안의 코드 가 너무 복잡 할 수 있 으 며 어느 정도 에'단일 직책 원칙'에 위배 된다4.567917.실례 화 된 대상 이 장시간 이용 되 지 않 으 면 시스템 이 쓰레기 로 여 겨 져 회수 되 고 대상 상태의 손실 을 초래 할 수 있다3.단일 모델 의 실현 방식
3.1 일반적인 상황
굶 주 린 한식(가장 간단 한 단 례 실현 방식)

class Singleton {
  private static Singleton ourInstance = new Singleton();

  private Singleton() {
  }

  public static Singleton newInstance() {
    return ourInstance;
  }
}
응용 필드:
  • 응용 시작 시 직접 불 러 오고 초기 화 해 야 합 니 다
  • 단일 대상 은 초기 화 속도 가 매우 빠 르 고 메모리 사용량 이 매우 적다
  • 게으름뱅이 식
    게으름뱅이 식 과 굶 주 린 한식 의 가장 큰 차 이 는 단일 한 초기 화 작업 의 시기 이다.
    4.567917.굶 주 린 한식:단일 사례 의 초기 화 를 자동 으로 진행 합 니 다
  • 게으름뱅이 식:필요 할 때 뉴 인 스 턴 스()를 수 동 으로 호출 하여 단일 초기 화 작업 을 합 니 다
  • 
    class Singleton {
      private static Singleton ourInstance = null;
    
      private Singleton() {
      }
    
      public static Singleton newInstance() {
      if( ourInstance == null){
        ourInstance = new Singleton();
        }
        return ourInstance;
      }
    }
    응용 필드:
    4.567917.단일 초기 화 작업 시간 이 비교적 길 고 응용 은 시작 속도 에 대한 요구 가 있다4.567917.단일 사례 의 점용 메모리 가 비교적 크다4.567917.단일 사례 는 특정한 장면 의 상황 에서 만 사용 된다.즉,필요 에 따라 단일 사례 를 지연 시 키 는 것 이다3.2 다 중 스 레 드 에서 의 단일 사례 모델 실현
    다 중 스 레 드 의 경우:
  • '굶 주 린 사람 식 단일 사례 모델'에 대해 적 용 됩 니 다.JVM 은 단일 사례 만 불 러 오기 때 문 입 니 다
  • 4.567917.'게으름뱅이 식 단일 예 모드':적용 되 지 않 습 니 다.'게으름뱅이 식'은 단일 예 를 만 들 때 스 레 드 가 안전 하지 않 기 때문에 여러 스 레 드 가 new Instance 방법 을 동시에 호출 하여 단일 대상 을 중복 만 드 는 문제 가 발생 할 수 있 습 니 다솔 루 션 1:동기 화 잠 금
    동기 화 잠 금 synchronized(Singleton.class)를 사용 하여 다 중 스 레 드 가 동시에 들 어가 인 스 턴 스 가 여러 번 예화 되 는 것 을 방지 합 니 다.
    
    class Singleton {
      private static Singleton ourInstance = null;
    
      private Singleton() {
      }
    
      public static Singleton newInstance() {
       synchronized (Singleton.class){
         if( ourInstance == null){
          ourInstance = new Singleton();
        }
       }
        return ourInstance;
      }
    }
    해결 방안 2:이중 검사 자물쇠
    동기 화 잠 금 기반(synchronized(Singleton.class)에 if 를 추가 하 였 습 니 다.인 스 턴 스 가 정례 화 된 후 다음 에 들 어 갈 때 synchronized(Singleton.class)를 실행 하지 않 아 도 대상 잠 금 을 가 져 와 성능 을 향상 시 키 기 위해 서 입 니 다.
    
    class Singleton {
      private static Singleton ourInstance = null;
    
      private Singleton() {
      }
    
      public static Singleton newInstance() {
    if( ourInstance == null){
     synchronized (Singleton.class){
       if( ourInstance == null){
         ourInstance = new Singleton();
         }
       }
     }
        return ourInstance;
      }
    }
    해결 방안 3:정적 내부 클래스
    JVM 에서 클래스 로 딩 을 할 때 데이터 가 동기 화 되 는 것 을 보장 합 니 다.저 희 는 내부 클래스 로 실현 합 니 다.내부 클래스 에서 대상 인 스 턴 스 를 만 듭 니 다.
    응용 프로그램 에서 내부 클래스 JVM 을 사용 하지 않 으 면 이 단일 클래스 를 불 러 오지 않 고 단일 대상 을 만 들 지 않 아'게으름뱅이 식'의 지연 로드 와 스 레 드 안전 을 실현 합 니 다.
    
    class Singleton {
    
      //                 
      private static class Singleton2{
       private static Singleton ourInstance = new Singleton();
      }
      private Singleton() {
      }
    
      public static Singleton newInstance() {
        return Singleton2.ourInstance;
      }
    }
    해결 방안 4:매 거 유형
    가장 간결 하고 사용 하기 쉬 운 단일 구현 방식(추천)
    
    public enum Singleton{
    
      //         ,   Singleton     
      instance;
    
      public void doSomething(){
      }  
    
    }
    사용 방식 은 다음 과 같 습 니 다.
    
    Singleton singleton = Singleton.instance;
    singleton.doSomething();
    5.총화
    본 고 는 주로 단일 모델 에 대해 전면적으로 소 개 했 는데 원리 와 실현 방식 을 포함한다.그 다음 에 저 는 다른 디자인 모델 을 계속 설명 하고 관심 이 있 으 면 계속 관심 을 가 질 수 있 습 니 다.
    읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

    좋은 웹페이지 즐겨찾기