一:原型模式
原型模式适用于对于一个已有的对象进行复制,复制之后在进行修改等等,在大量使用循环创建对象,并且赋值差不多的情况下该方式就体现出极大的优势来。原型模式原理还是基于java中克隆,而java中的克隆分为2种浅克隆和深克隆。
浅克隆:浅克隆是指克隆了原对象的数据类型,浅克隆只适用于一些基本的数据类型。不会克隆引用的对象
深克隆: 可科隆引用对象
二:浅克隆解析
1.只有基本数据类型的浅克隆
浅克隆适用于基础数据类型的克隆。由于基本数据类型只存在栈地址(String除外),因此使用==返回的都是true,而String类型由于其存在一个String的常量池,导致其使用==也是相等的。
package com.xncoding.pos;
//可以被克隆的对象,必须实现cloneable接口
public class User implements Cloneable {
private String userName;
private Integer age;
private Integer sex;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public static void main(String[] args) throws CloneNotSupportedException {
//浅克隆,适用于只有基础数据类型的对象,其应用的地址都是一致。
User u1=new User();
u1.setUserName("A");
u1.setAge(11);
u1.setSex(1);
//====当被克隆的对象中有引用类型时
User u2=(User) u1.clone();
System.out.println(u2.getUserName()==u1.getUserName());
}
}
2.含有引用类型的浅克隆
含有引用类型的数据(String除外),在克隆时,是不会科隆引用类型的对象的数据的,这里就得采用深克隆
package com.xncoding.pos;
public class Book implements Cloneable{
private String bookName;
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public static void main(String[] args) {
}
}
package com.xncoding.pos;
//可以被克隆的对象,必须实现cloneable接口
public class User implements Cloneable {
private String userName;
private Integer age;
private Integer sex;
private Book book;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public Book getBook() {
return book;
}
public void setBook(Book book) {
this.book = book;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public static void main(String[] args) throws CloneNotSupportedException {
//浅克隆,适用于只有基础数据类型的对象,其应用的地址都是一致。
User u1=new User();
u1.setUserName("A");
u1.setAge(11);
u1.setSex(1);
Book book=new Book();
book.setBookName("6bs");
//====当被克隆的对象中有引用类型时,引用类型不会被克隆过来
User u2=(User) u1.clone();
System.out.println(u2.getUserName()==u1.getUserName());
System.out.println(u2.getBook());
}
}
三:深克隆
package com.xncoding.pos;
public class Book implements Cloneable{
private String bookName;
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
package com.xncoding.pos;
//可以被克隆的对象,必须实现cloneable接口
public class User implements Cloneable {
private String userName;
private Integer age;
private Integer sex;
private Book book;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public Book getBook() {
return book;
}
public void setBook(Book book) {
this.book = book;
}
@Override
protected Object clone() throws CloneNotSupportedException {
User user=(User) super.clone();
user.setBook((Book)book.clone());
return user;
}
public static void main(String[] args) throws CloneNotSupportedException {
User u1=new User();
u1.setUserName("A");
u1.setAge(11);
u1.setSex(1);
Book book=new Book();
book.setBookName("6bs");
u1.setBook(book);
User u2=(User) u1.clone();
System.out.println(u2.getUserName()==u1.getUserName());
System.out.println(u2.getBook().getBookName() == u1.getBook().getBookName());
}
}