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,意思是通过序列化克隆,否则异常