다섯 가지 단일 모델 의 안전성 문제

3261 단어 디자인 모드
앞의 두 강 에서 게으름뱅이 식, 굶 주 린 한식, 이중 자물쇠, 내부 류, 매 거 진 5 가지 단일 모델 을 소 개 했 는데 사실은 단일 모델 은 여러 가지 디자인 이 있 는데 여기 서 일일이 소개 하지 않 았 다.
이 5 가지 단일 모델 중에서 매 거 진 것 이 가장 특수 하 다. 정부 가 제공 하 는 모델 이기 때문에 풀 리 지 않 고 매우 안전 하 다.
나머지 4 가지 중에서 우 리 는 게으름뱅이 식 을 예 로 들 어 안전 문 제 를 말한다.
정상 호출 코드:
public class Client {
	public static void main(String[] args) {
		Husband01 s011 = Husband01.getWife();
		Husband01 s012 = Husband01.getWife();
		
		System.out.println(s011);
		System.out.println(s012);
		System.out.println(s011 == s012);
	}
}

출력 결과
Husband01@c3c749
Husband01@c3c749
true

다음은 반사 로 단일 모드 를 해독 합 니 다.
import java.lang.reflect.Constructor;
public class Client {
	public static void main(String[] args) throws Exception {
		Husband01 s011 = Husband01.getWife();
		Husband01 s012 = Husband01.getWife();
		
		//         
		Class h1 = (Class) Class.forName("Husband01");//    H1  
		Constructor c = h1.getDeclaredConstructor(null);//        
		c.setAccessible(true);//             
		Husband01 s013 = (Husband01) c.newInstance(null);//     
		
		System.out.println(s011);
		System.out.println(s012);
		System.out.println(s013);
		System.out.println(s011 == s012);
		System.out.println(s011 == s013);
	}
}

출력 결과
Husband01@1bc4459
Husband01@1bc4459
Husband01@12b6651
true
false

다른
직렬 화 해독 (Serializable 구현) 단일 모드:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class Client {
	public static void main(String[] args) throws Exception {
		Husband01 s011 = Husband01.getWife();
		Husband01 s012 = Husband01.getWife();
		
		//           
		FileOutputStream fos = new FileOutputStream("d:/a.txt");
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		oos.writeObject(s011);
		fos.close();
		oos.close();
		
		FileInputStream fis = new FileInputStream("d:/a.txt");
		ObjectInputStream ois = new ObjectInputStream(fis);
		Husband01 s013 = (Husband01) ois.readObject();
		fis.close();
		ois.close();
		
		System.out.println(s011);
		System.out.println(s012);
		System.out.println(s013);
		System.out.println(s011 == s012);
		System.out.println(s011 == s013);
	}
}

출력 결과
Husband01@13bad12
Husband01@13bad12
Husband01@1a626f
true
false

우 리 는 이제 알 았 다. 풀 면 피 할 수 있다 면?
코드 는 이렇게 써 야 돼!
import java.io.ObjectStreamException;
import java.io.Serializable;

/**
 *      :         ,       (    )
 */
public class Husband01 implements Serializable{
	//         ,                  
	private static Husband01 wife = null;
	//     ,       
	private Husband01(){
		if(wife != null){//      
			throw new RuntimeException();
		}
	}
	
	//            
	public static synchronized Husband01 getWife(){//  synchronized        
		if(wife == null){
			wife = new Husband01();//              !
		}
		return wife;
	}
	
	//         
    private Object readResolve() throws ObjectStreamException {    
        return wife;  
    } 
}

이렇게 하면 우 리 는 풀 리 는 것 을 피 할 수 있 습 니까?그렇다면 다섯 가지 디자인 모델 의 효율 은 어 떨 까?5 가지 단일 모델 의 효율 문 제 를 보 세 요!

좋은 웹페이지 즐겨찾기