您的位置 首页 java

Java,设计模式,创建型,原型模式,浅拷贝(复制)和深拷贝

原型模式(Prototype Pattern):

用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。

原型模式的核心就是拷贝(复制)对象, 拷贝对象分为:浅拷贝(浅复制)和深拷贝(深复制);浅拷贝:只拷贝对象中的基本数据类型(8种),对于数组、容器、引用对象等都不会拷贝;深拷贝:不仅能拷贝基本数据类型,还要拷贝数组、容器、引用对象等;

原型模式的角色:

抽象原型类(Prototype)、具体原型类(Concrete Prototype)和访问类(Client);

java 实现原型模式的方法是:克隆(Object类中的clone()方法)、通过对象 序列化 以及反序列化;

原型模式的应用场景

1、类初始化需要消化非常多的资源,这个资源包括:数据、硬件资源等,通过原型拷贝避免这些消耗。

2、通过new一个对象需要非常繁琐的数据准备或访问权限,可以使用原型模式。

3、一个对象需要提供给其他对象访问,而且各个调用者可能需要修改其值,可以考虑使用原型模式拷贝多个对象供调用者使用,即保护性拷贝。

原型模式的代码案例

1、浅拷贝实现

 /**
* java.lang.Cloneable为抽象原型类(Prototype)
* Person为具体原型类
*/public class Person implements Cloneable{

private int id;

private String name;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

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

@ Override 
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}


}  
 /**
 * 访问类(Client)
 */public class PrototypePattern {

public static void main(String[] args) {
// 浅拷贝实现
Person person = new Person();
person.setId(1024);
person.setName("唐僧");
Person person2 = null;
try {
person2 = (Person) person.clone();
System.out.println(person2.getId() + "," + person2.getName());
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
System.out.println(person == person2);
System.out.println("person  hashCode  -> " + person.hashCode());
System.out.println("person2 hashCode -> " + person2.hashCode());
System.out.println(person.equals(person2));
}

}  

2、深拷贝实现,通过实现java.lang.Cloneable接口

 /**
* java.lang.Cloneable为抽象原型类(Prototype)
* Person为具体原型类
*/public class Person implements Cloneable{

private int id;

private String name;

private IDCard idCard;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

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

public IDCard getIdCard() {
return idCard;
}

public void setIdCard(IDCard idCard) {
this.idCard = idCard;
}

@Override
protected Object clone() throws CloneNotSupportedException {
Person person = null;
try {
person = (Person)super.clone();
IDCard cloneIDCard = (IDCard)idCard.clone();
person.setIdCard(cloneIDCard);
}catch(Exception e) {
}
return person;
}


}  
 /**
 * java.lang.Cloneable为抽象原型类(Prototype)
 * IDCard为具体原型类
 */public class IDCard implements Cloneable {

// 号码
private String  number ;

// 过期时间
private String expiryTime;

public String getExpiryTime() {
return expiryTime;
}

public String getNumber() {
return number;
}

public void setExpiryTime(String expiryTime) {
this.expiryTime = expiryTime;
}

public void setNumber(String number) {
this.number = number;
}

@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}


}
  
 /**
 * 访问类(Client)
 */public class PrototypePattern {

public static void main(String[] args) {
// 深拷贝实现
IDCard idCard = new IDCard();
idCard.setNumber("2020XXXXXXXXXXXXXXXXXXXXXXX");
idCard.setExpiryTime("20200720");
Person person = new Person();
person.setId(1024);
person.setName("唐僧");
person.setIdCard(idCard);

Person person2 = null;
try {
person2 = (Person) person.clone();
System.out.println(person2.getId() + "," + person2.getName());
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
System.out.println("person==person2 => " + (person == person2));
System.out.println("person hashCode => " + person.hashCode());
System.out.println("person2 hashCode => " + person2.hashCode());
System.out.println("person equals person2 => " + person.equals(person2));

System.out.println("IdCard==IdCard2 => " + (person.getIdCard() == person2.getIdCard()));
System.out.println("person IdCard hashCode -> " + person.getIdCard().hashCode());
System.out.println("person2 IdCard hashCode -> " + person2.getIdCard().hashCode());
System.out.println("IdCard equals IdCard2 => " + person.getIdCard().equals(person2.getIdCard()));
}

}  

3、深拷贝实现,通过序列化和反序列化实现

 /**
 * 抽象原型类(Prototype)
 */public interface AbstractPrototype {

public Person cloneObject();

}  
 public class Person implements java.io.Serializable,AbstractPrototype {

private static final long serialVersionUID = 29082744664639018L;

private int id;

private String name;

private IDCard idCard;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

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

public IDCard getIdCard() {
return idCard;
}

public void setIdCard(IDCard idCard) {
this.idCard = idCard;
}
 
public Person cloneObject(){
Person person = null;
try {
// 序列化操作
ByteArrayOutputStream byteOuput = new ByteArrayOutputStream();
ObjectOutputStream objectOuput = new ObjectOutputStream(byteOuput);
objectOuput.writeObject(this);
// 反序列化(字节数组缓冲区)
ByteArrayInputStream byteInput = new ByteArrayInputStream(byteOuput.toByteArray());
ObjectInputStream objectInput = new ObjectInputStream(byteInput);
person = (Person)objectInput.readObject();

objectInput. close ();
byteInput.close();
byteOuput.close();
objectOuput.close();
} catch (Exception e) {
e.printStackTrace();
}

return person;
}


}  
 public class IDCard implements java.io.Serializable {

private static final long serialVersionUID = -2351753423118799929L;

// 号码
private String number;

// 过期时间
private String expiryTime;

public String getExpiryTime() {
return expiryTime;
}

public String getNumber() {
return number;
}

public void setExpiryTime(String expiryTime) {
this.expiryTime = expiryTime;
}

public void setNumber(String number) {
this.number = number;
}

}  
 /**
 * 访问类(Client)
 */public class PrototypePattern {

public static void main(String[] args) {
// 深拷贝实现
IDCard idCard = new IDCard();
idCard.setNumber("2020XXXXXXXXXXXXXXXXXXXXXXX");
idCard.setExpiryTime("20200720");
Person person = new Person();
person.setId(1024);
person.setName("唐僧");
person.setIdCard(idCard);

Person person2 = null;
try {
person2 = (Person) person.cloneObject();
System.out.println(person2.getId() + "," + person2.getName());
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("person==person2 => " + (person == person2));
System.out.println("person hashCode => " + person.hashCode());
System.out.println("person2 hashCode => " + person2.hashCode());
System.out.println("person equals person2 => " + person.equals(person2));

System.out.println("IdCard==IdCard2 => " + (person.getIdCard() == person2.getIdCard()));
System.out.println("person IdCard hashCode -> " + person.getIdCard().hashCode());
System.out.println("person2 IdCard hashCode -> " + person2.getIdCard().hashCode());
System.out.println("IdCard equals IdCard2 => " + person.getIdCard().equals(person2.getIdCard()));
}

}  

文章来源:智云一二三科技

文章标题:Java,设计模式,创建型,原型模式,浅拷贝(复制)和深拷贝

文章地址:https://www.zhihuclub.com/181796.shtml

关于作者: 智云科技

热门文章

网站地图