原型模式
使用cloneable接口实现原型模式,包括浅复制、深复制
********************************************
相关接口
Cloneable
public interface Cloneable {
}
说明:该接口只是一个标识接口,表明类可被复制,具体实现在Object类中
****************************************************
示例
*****************************
浅复制
class Address{
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Person implements Cloneable{
private String name;
private Integer age;
private Address address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String toString() {
return this.name+" "+this.age+" "+this.address+" "+super.toString();
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class MyTest {
public static void main(String[] args) throws Exception{
Address address=new Address();
address.setId(1);
address.setName("新世界");
Person person=new Person();
person.setName("瓜田李下");
person.setAge(24);
person.setAddress(address);
System.out.println(person);
Person person2=(Person)person.clone();
System.out.println(person2);
}
}
*****************************
控制台输出
瓜田李下 24 hello4.Address@49097b5d hello4.Person@2f4d3709
瓜田李下 24 hello4.Address@49097b5d hello4.Person@6e2c634b
*********************************
深复制
class Address implements Cloneable{
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer 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();
}
}
class Person implements Cloneable{
private String name;
private Integer age;
private Address address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String toString() {
return this.name+" "+this.age+" "+this.address+" "+super.toString();
}
@Override
protected Object clone() throws CloneNotSupportedException {
Person person=(Person)super.clone();
person.setAddress((Address)address.clone());
return person;
}
}
public class MyTest {
public static void main(String[] args) throws Exception{
Address address=new Address();
address.setId(1);
address.setName("新世界");
Person person=new Person();
person.setName("瓜田李下");
person.setAge(24);
person.setAddress(address);
System.out.println(person);
Person person2=(Person)person.clone();
System.out.println(person2);
}
}
*******************************
控制台输出
瓜田李下 24 hello4.Address@49097b5d hello4.Person@2f4d3709
瓜田李下 24 hello4.Address@37a71e93 hello4.Person@6e2c634b