设计模式之---原型模式


1)什么是原型?

a、开发项目前用Axure设计的原型是项目的原型

b、中国的现代化发展向美国等先进国家学习,它们是中国的发展的原型

c、孩子学步说话,父母亲人是他的原型


2)为什么要用原型设计呢?(什么时候用?)

a、在Java中提供一个原型对象,可以不去关注原型对象的类型,不关注new关键字,顺便拷贝原型拥有的属性等信息

b、项目的原型就是项目真正开始开发前的需求确认


3)怎么使用呢?

a、使用Java-祖宗类Object的clone()接口实现浅克隆

b、使用序列化接口实现深度克隆


4)什么是浅度克隆?什么是深度克隆?

a、浅度克隆:只克隆原型对象的 基本属性(如基本类型、字符串),无法克隆引用类型

b、深度克隆:克隆原型对象的 基本属性 + 引用类型


5)具体实现代码如下:

Book

package com.wendy.protype.dto;

import java.io.Serializable;

public class Book implements Serializable {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private String name;
	
	private float price;
	
	private String autor;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public float getPrice() {
		return price;
	}

	public void setPrice(float price) {
		this.price = price;
	}

	public String getAutor() {
		return autor;
	}

	public void setAutor(String autor) {
		this.autor = autor;
	}
}

User

package com.wendy.protype.dto;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class User implements Cloneable,Serializable{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private String name;
	
	private int age;
	
	private String address;
	
	private int sex;
	
	private Book book;

	public Book getBook() {
		return book;
	}

	public void setBook(Book book) {
		this.book = book;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public int getSex() {
		return sex;
	}

	public void setSex(int sex) {
		this.sex = sex;
	}

	@Override
	public Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
	
	public Object deepClone() throws IOException, ClassNotFoundException{
		
		// 将对象写到流里
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		ObjectOutputStream oos = new ObjectOutputStream(baos);
		oos.writeObject(this);
		
		ByteArrayInputStream bis = new ByteArrayInputStream(baos.toByteArray());
		ObjectInputStream ois = new ObjectInputStream(bis);
		
		return ois.readObject();
		
	}
	
}


Client

package com.wendy.protype;

import java.io.IOException;

import com.wendy.protype.dto.Book;
import com.wendy.protype.dto.User;


public class Client {

	public static void main(String[] args) {
		
		Book book = new Book();
		book.setPrice(28);
		book.setAutor("程序员");
		User user = new User();
		user.setBook(book);
		user.setName("Zemel");
		user.setAge(26);
		user.setSex(1);
		user.setAddress("天河车陂");
		
		// 浅度克隆
//		User cloneUser = null;
//		try {
//			cloneUser = (User)user.clone();
//		} catch (CloneNotSupportedException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//		book.setName("大话设计模式");
//		System.out.println(cloneUser == user);
//		
//		System.err.println(cloneUser.getName());
//		System.err.println(cloneUser.getBook().getName());
		
		// 深度克隆
		User cloneUser = null;
		try {
			cloneUser = (User)user.deepClone();
		}  catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		book.setName("大话设计模式");
		System.err.println(user.getBook().getName());
		System.err.println(cloneUser == user);
		
		System.err.println(cloneUser.getName());
		System.err.println(cloneUser.getBook().getName());
	}

}


PS:浅克隆 需要实现 接口 Clonable,意思是告诉Jvm这个对象可以放心克隆,否则异常

        深度克隆 需要实现 接口Serializable,意思是通过序列化克隆,否则异常




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值