原型模式
这是设计模式里我觉得最简单的模式,,,
定义
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
使用场景
1 类的初始化需要消耗非常多的资源,这个资源包括数据,硬件资源等,通过原型拷贝避免这些消耗。
2 通过new产生一个对象需要消耗非常繁琐的数据准备或访问权限,这时可以使用原型模式。
3 一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑用原型模式拷贝多个对象供调用者使用,即保护性拷贝。
好处
clone是从内存中以二进制流的方式进行拷贝,重新分配一个内存块,不执行构造函数,所以这种拷贝方式比直接new一个对象性能好很多。
拷贝就是实现cloneable接口,这里分为浅拷贝与深拷贝,下面分别实现下:
import java.util.ArrayList;
public class People implements Cloneable {
private int age;
private String name;
private String addr;
private ArrayList<String> friends;
public ArrayList<String> getFriends() {
return friends;
}
public void setFriends(ArrayList<String> friends) {
this.friends = friends;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
// 浅克隆
/*
public People clone() {
People people = null;
try {
people = (People) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return people;
}
*/
// 深克隆
public People clone() {
People people = null;
try {
people = (People) super.clone();
people.friends = (ArrayList<String>) this.friends.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return people;
}
}
测试类:
public class Client {
public static void main(String[] args){
People p = new People();
ArrayList<String> pF = new ArrayList();
pF.add("张三");
p.setFriends(pF);
People pClone = p.clone();
pClone.getFriends().add("王五");
System.out.println(p.getFriends());
}
}