1、概念
原型模式是一种创建型设计模式,允许一个对象创建另外一个可定制的对象,无需知道创建的细节。
2、浅拷贝和深拷贝
- 浅拷贝:对于基本数据类型的成员变量,浅拷贝会直接进行值拷贝,也就是将该属性复制一份给新的对象;引用数据类型的成员变量(数组或者对象),那么浅拷贝会进行引用传递,也就是将该成员变量的引用值复制一份给新的对象。
- 深拷贝:对于基本数据类型的成员变量,将该属性复制一份给新的对象;为每个引用数据类型的成员变量申请空间,并复制每个成员变量所引用的对象,直到该对象可到的所有对象。
3、实现
3.1、浅拷贝
借助Object类的clone方法,可以简单实现对象的复制。(但是clone方法是实现的浅拷贝,如果要实现深拷贝,还需要写代码实现)
- 实现Cloneable接口。
- 重写clone方法,并修改方法访问级别为public。
package com.mine.design.prototype;
public class Person implements Cloneable {
private String name;
private int age;
private String sex;
private String country;
private Phone phone;
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 getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public Phone getPhone() {
return phone;
}
public void setPhone(Phone phone) {
this.phone = phone;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", sex=" + sex + ", country=" + country + ", phone=" + phone
+ "]";
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
package com.mine.design.prototype;
public class Phone {
private String brand;
private String type;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
package com.mine.design.prototype;
public class Client {
public static void main(String[] args) throws Exception {
Person p = new Person();
p.setName("西施");
p.s