디자인 모델 의 아름다움 - 단일 모델
예 가 무엇 입 니까?
응용 장면
코드 구현
굶 주 린 사람 식
중국 고대 신화 중 에 여 와 보 천 설 이 있 는데, 지금 은 하늘 이 깨 졌 으 니, 우 리 는 여 와 보 천 을 구 하 러 간다.
여 와 는 영어 로 말 하면 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 수식 여 부 를 검사 합 니 다. 만약 그렇다면 이상 을 던 져 반사 에 실 패 했 습 니 다.그래서 발사 공격 을 두려워 하지 않 는 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.