원형 모드(protype)-1

5285 단어 디자인 모드
원형 마치 손오공 하나 가 똑 같은 손오공 으로 변 하 는 것 과 같다.  * 자바 의 구성 요소 모델 은 원본 모드 를 직접 지원 합 니 다.  * 모든 자바 빈 은 Object 를 계승 하고 Object 류 는 clone 방법 을 제공 합 니 다.  * 자바 빈 대상 을 복사 할 수 있 습 니 다.  * 그러나 이 자바 빈 은 반드시 표지 인 터 페 이 스 를 실현 해 야 한다.Cloneable.  * -----------------------  * 클론 만족 조건:  * clone 방법 은 대상 을 복사 하여 호출 자 에 게 돌려 줍 니 다.이른바'복제'의 의미 와 clone 방법 은 어떻게  * 실현 의 관계.일반적으로 clone 방법 은 다음 과 같은 설명 을 만족시킨다.  * 1.모든 대상 X 에 대해:X.clone()!=X 복제 대상 은 원래 대상 과 같은 대상 이 아니다  * 2.  X.clone().getClass()==X.getClass()복제 대상 은 원래 대상 의 유형 과 같 습 니 다.  * 3.  대상 X 의 equals()방법 정의 가 적절 하 다 면 X.clone().equals(X)는 성립 됩 니 다.  * (Object 클래스 에서 equals()방법의 기본 구현 은 return(this==obj)입 니 다.즉,두 변수 가 같은 대상 을 가리 킬 때 true 로 돌아 갑 니 다)
 
패턴 구현-얕 은 복사 와 깊 은 복사
다음 예:
/**
 *    
 */
public class Monkey implements Cloneable, Serializable {

	private static final long serialVersionUID = -5655707590382020734L;

	private int height;
	private int weight;
	private GoldRingedStaff staff;
	private Date birthDate;

	public Monkey() {
		this.birthDate = new Date();
		this.staff = new GoldRingedStaff();
	}

	public int getHeight() {
		return height;
	}

	public void setHeight(int height) {
		this.height = height;
	}

	public int getWeight() {
		return weight;
	}

	public void setWeight(int weight) {
		this.weight = weight;
	}

	public GoldRingedStaff getStaff() {
		return staff;
	}

	public void setStaff(GoldRingedStaff staff) {
		this.staff = staff;
	}

	public Date getBirthDate() {
		return birthDate;
	}

	public void setBirthDate(Date birthDate) {
		this.birthDate = birthDate;
	}

	//   
	//           (              (Serilization)  )
	public Object deepClone() throws IOException, ClassNotFoundException {

		//        
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		ObjectOutputStream oos = new ObjectOutputStream(baos);
		oos.writeObject(this);

		//       
		ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
		ObjectInputStream ois = new ObjectInputStream(bais);
		return ois.readObject();

	}

	//     
	@Override
	protected Object clone() throws CloneNotSupportedException {
		return (Monkey) super.clone();
	}
	
	@Override
	public String toString() {
		return "birthDate=" + birthDate + " height=" + height + " weight="
				+ weight + " GoldRingedStaff=" + staff;
	}
}

 
//   
public class GoldRingedStaff implements Cloneable, Serializable {

	private static final long serialVersionUID = -206209645135740010L;

	//   
	private float height = 100.0F;
	//   
	private float diameter = 100.0f;

	public GoldRingedStaff() {
	}

	//      
	public void grow() {
		this.diameter *= 2.0;
		this.height *= 2.0;
	}
	
	//      
	public void shrink() {
		this.diameter /= 2.0;
		this.height /= 2.0;
	}
	
	//  
	public void move(){
	}

	public float getHeight() {
		return height;
	}

	public void setHeight(float height) {
		this.height = height;
	}

	public float getDiameter() {
		return diameter;
	}

	public void setDiameter(float diameter) {
		this.diameter = diameter;
	}
	
	@Override
	public String toString() {
		return "height=" + height + " diameter" + diameter;
	}
}

 
//  
public class MainApp {

	private Monkey money = new Monkey();

	void change() throws Exception {
		Monkey copyMoney;
		Thread.sleep(1000);
		copyMoney = (Monkey) money.clone();
		System.out.println("    Money="+money);
		System.out.println("copyMoney="+copyMoney);
		System.out.println("money==copyMoney?"+(money==copyMoney));
		System.out.println((money.getStaff() == copyMoney.getStaff())?"money.getStaff() == copyMoney.getStaff()":"money.getStaff() != copyMoney.getStaff()");
		
		Thread.sleep(1000);
		System.out.println("---------------deep Copy------------------------------------");
		copyMoney = (Monkey) money.deepClone();
		System.out.println("    Money="+money);
		System.out.println("copyMoney="+copyMoney);
		System.out.println("money==copyMoney?"+(money==copyMoney));
		System.out.println((money.getStaff() == copyMoney.getStaff())?"money.getStaff() == copyMoney.getStaff()":"money.getStaff() != copyMoney.getStaff()");
		
	}

	/**
	 * 
	 *    
	 *          ,            
	 *                  ,                  
	 * 
	 *    
	 *             Serializable   Cloneable  
	 *                  ,                     
	 */
	public static void main(String[] args) {
		try {
			new MainApp().change();
		} catch (Exception e) {
			e.printStackTrace();
		}
		//out put     
	    /*Money=birthDate=Tue Dec 07 00:28:21 CST 2010 height=0 weight=0 GoldRingedStaff=height=100.0 diameter100.0
	    copyMoney=birthDate=Tue Dec 07 00:28:21 CST 2010 height=0 weight=0 GoldRingedStaff=height=100.0 diameter100.0
	    money==copyMoney?false
	    money.getStaff() == copyMoney.getStaff()
	    ---------------deep Copy------------------------------------
	        Money=birthDate=Tue Dec 07 00:28:21 CST 2010 height=0 weight=0 GoldRingedStaff=height=100.0 diameter100.0
	    copyMoney=birthDate=Tue Dec 07 00:28:21 CST 2010 height=0 weight=0 GoldRingedStaff=height=100.0 diameter100.0
	    money==copyMoney?false
	    money.getStaff() != copyMoney.getStaff()*/
	}
}

좋은 웹페이지 즐겨찾기