디자인 모델 의 아름다움 - 단일 모델

17701 단어
단일 모드
예 가 무엇 입 니까?
  • 이 종 류 는 하나의 실례 만 있 을 수 있다.
  • 이런 종 류 는 자신의 대상 을 만 드 는 것 을 책임 진다.
  • 전체 프로젝트 에서 이 인 스 턴 스 를 방문 할 수 있 습 니 다.

  • 응용 장면
  • 프로필 을 읽 을 때 전역 Config 클래스 를 유지 합 니 다.
  • 스 레 드 탱크, 연결 탱크 는 통일 적 으로 분배 와 관 리 를 한다.
  • 사이트 의 카운터 도 단일 모델 로 실현 할 수 있 고 동기 화
  • 를 유지 할 수 있다.
    코드 구현
    굶 주 린 사람 식
     중국 고대 신화 중 에 여 와 보 천 설 이 있 는데, 지금 은 하늘 이 깨 졌 으 니, 우 리 는 여 와 보 천 을 구 하 러 간다.
    여 와 는 영어 로 말 하면 A Goddess In Chinese Mythology 로 신화 속 의 여신 이라는 뜻 이다. 여 와 는 유일무이한 것 이다. 지금 우 리 는 여신 류 Goddess 를 만 들 것 이다.
    1 public class Goddess {
    2     
    3 }

    신화 에서 우 리 는 모두 여 와 가 만 든 것 이 고 사람 은 여 와 를 만 들 수 없 기 때문에 여 와 의 민영화 구 조 를 원한 다.
    1 public class Goddess {
    2     private Goddess(){};//     
    3 }

    사람 이 여 와 를 만 들 수 없 는 이상 여 와 는 어떻게 왔 을 까? 여 와 는 천지 가 처음 열 리 면서 생 겨 났 기 때문에 스스로 상 대 를 만들어 야 한다.
    1 public class Goddess {
    2     private static final Goddess goddess = new Goddess();//      
    3     private Goddess(){};//     
    4 }

    여 와 는 신비 로 운 것 이다. 범 태 육안 으로 볼 수 없 기 때문에 private 를 원한 다. static 는 여 와 가 천지 초 개 와 함께 메모리 에서 영생 하고 쓰레기 회수 기 에 의 해 회수 되 지 않도록 보장 했다.final 보증 여 와 는 변 하지 않 을 것 이다. 영원히 그 여신 이다. < unk >.. < unk >...
    1 public class Goddess {
    2     private static final Goddess goddess = new Goddess();//      
    3     private Goddess(){};//     
    4     public static Goddess getInstance(){//         
    5         return goddess;
    6     }
    7 }

    단일 사례 가 예화 되 지 않 는 이상 대상 을 얻 기 위해 서 는 정적 인 방법 이 필요 하 다.이것 은 단 례 의 '굶 주 린 한식' 으로 코드 두 번 째 줄 에 여 와 가 생 겼 다.
    검증 해 보 겠 습 니 다.
    1 public class GoddessTest {
    2     public static void main(String[] args){
    3         Goddess goddes1 = Goddess.getInstance();
    4         Goddess goddes2 = Goddess.getInstance();
    5         System.out.println("           :"+(goddes1==goddes2));
    6     }
    7 }

    결과:
    true

    두 대상 의 인용 은 같은 대상 으로 우리 가 단일 모델 을 실현 했다 는 것 을 설명 한다.
    게으름뱅이 식
     1 public class Goddess {
     2     private static Goddess goddess ;//       
     3     private Goddess(){};//     
     4     public static Goddess getInstance(){//         
     5 
     6         if (goddess == null) {//          
     7             goddess = new Goddess();
     8         }
     9         return goddess;
    10     }
    11 }

    여 와 는 비교적 게 으 르 고 할 일이 없 을 때 혼돈 상태 에 있 었 다. 처음으로 여 와 를 구 했 을 때 여 와 는 비로소 실례 화 되 었 다.
    장점: 한동안 메모 리 를 절약 하고,
    나 쁜 점: 처음으로 여 와 를 초대 하면 느 릴 것 이다. 왜냐하면 CPU 를 소모 하여 예화 해 야 하기 때문이다.다 중 스 레 드 아래 에 도 문제 가 있다. 만약 에 여러 사람 이 동시에 여 와 를 초대 하면 많은 여 와 가 생 길 것 이다. 스 레 드 가 안전 한 것 이 아니다.
    우 리 는 synchronized 를 더 해서 최적화 시 켰 습 니 다. 스 레 드 호출 전에 동기 화 자 물 쇠 를 가 져 와 야 합 니 다. 호출 이 끝 난 후에 자 물 쇠 를 다른 스 레 드 에 사용 할 것 입 니 다. 즉, 여 와 는 반드시 줄 을 서 야 합 니 다. 모두 하나씩 오 세 요.
     1 public class Goddess {
     2     private static Goddess goddess ;//       
     3     private Goddess(){};//     
     4     public static synchronized Goddess getInstance(){//         
     5 
     6         if (goddess == null) {//          
     7             goddess = new Goddess();
     8         }
     9         return goddess;
    10     }
    11 }

    그러나 이렇게 많은 사람들 이 자 물 쇠 를 빼 앗 아야 한다. 대상 이 이미 예화 되 었 더 라 도 CPU 자원 의 병발 우 위 를 충분히 이용 하지 못 했다 (특히 다 핵 상황).
    우 리 는 synchronized 를 방법 체 내 에 넣 었 다. 만약 에 여 와 가 아직 예화 되 지 않 아서 야 자 물 쇠 를 빼 앗 았 다 면 이것 은 CPU 자원 을 크게 이용 했다.
    코드 는 다음 과 같 습 니 다:
    이중 검사 자물쇠.
     1 //          ,                。
     2 public class Goddess {
     3     private volatile static Goddess goddess ;//       
     4     private Goddess(){};//     
     5     public static Goddess getInstance(){//         
     6         if (goddess == null) {//          ,         ,       。
     7             synchronized(Goddess.class){
     8                 if (goddess == null) {//       ,          ,          
     9                     goddess = new Goddess();
    10                 }
    11             }
    12         }
    13         return goddess;
    14     }
    15 }

     매 거 모드
    1 public enum Goddess {
    2     INSTANCE;
    3     public Goddess getInstance(){
    4         return INSTANCE;
    5     }
    6 }

    상기 방식 은 반사 와 서열 화 를 고려 하지 않 고 이 루어 진 것 으로 반 사 를 고려 하면 단일 사례 류 는 하나의 사례 만 있 을 수 있다 는 주장 을 할 수 없다.그러나 매 거 진 사례 모델 은 이 두 가지 상황 을 피 할 수 있다.
    우 리 는 굶 주 린 사람 을 예 로 들 었 다.
     1 public class GoddessTest {
     2     public static void main(String[] args) throws Exception {
     3         Goddess goddes1=Goddess.getInstance();
     4         Goddess goddes2=Goddess.getInstance();
     5         Constructor constructor=Goddess.class.getDeclaredConstructor();
     6         constructor.setAccessible(true);
     7         Goddess goddes3=constructor.newInstance();
     8         System.out.println("     ,           :"+(goddes1 == goddes2));
     9         System.out.println("     ,           :"+(goddes1 == goddes3));
    10     }
    11 }

    결과:
    1      ,           :true
    2      ,           :false

    예 를 들 어 다음 예제:
     1 public class GoddessTest {
     2     public static void main(String[] args) throws Exception {
     3         Goddess goddes1=Goddess.INSTANCE;
     4         Goddess goddes2=Goddess.INSTANCE;
     5         Constructor constructor= null;
     6         constructor = Goddess.class.getDeclaredConstructor();
     7         constructor.setAccessible(true);
     8         Goddess goddes3= null;
     9         goddes3 = constructor.newInstance();
    10         System.out.println("     ,           :"+(goddes1 == goddes2));
    11         System.out.println("     ,           :"+(goddes1 == goddes3));
    12     }
    13 }

    결과:
    1 Exception in thread "main" java.lang.NoSuchMethodException: xxx.xxx.Goddess.()
    2     at java.lang.Class.getConstructor0(Class.java:3082)
    3     at java.lang.Class.getDeclaredConstructor(Class.java:2178)
    4     at com.slw.design.danli.GoddessTest.main(GoddessTest.java:11)

    new Instance 를 통 해 대상 을 만 들 때 이 클래스 가 enum 수식 여 부 를 검사 합 니 다. 만약 그렇다면 이상 을 던 져 반사 에 실 패 했 습 니 다.그래서 발사 공격 을 두려워 하지 않 는 다.

    좋은 웹페이지 즐겨찾기