原型模式是一种对象创建型模式,它采取复制原型对象的方法来创建对象的实例。使用原型模式创建的实例,具有与原型一样的数据。原型模式可以看作原型对象对自身的一个克隆。根据对象克隆深度层次的不同,有浅度克隆与深度克隆。
下面看原型模式结构图(摘自 程杰 大话设计模式)
下面利用java实现原型模式
public class Person implements Cloneable{
// 姓名
private String name;
// 年龄
private int age;
// 性别
private String sex;
//朋友
private List<String> friends;
public List<String> getFriends() {
return friends;
}
public void setFriends(List<String> friends) {
this.friends = friends;
}
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 Person clone() {
try {
Person person = (Person)super.clone();
List<String> newfriends = new ArrayList<String>();
for(String friend : this.getFriends()) {
newfriends.add(friend);
}
person.setFriends(newfriends);
return person;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
}
}
Person 实现 Cloneable接口,声明一个克隆自身的接口。实现 clone() 方法。实现Cloneable接口后 调用 Objecte的clone()方法,可以实现浅度克隆,浅度克隆指的是 只复制了值类型的字段属性,对于引用类的字段属性,复制引用但不复制引用的对象。原始对象与副本引用同一对象。如例子中的 List<String> friends ,所以要实现深复制只能自己动手在方法clone中实现。
下面是执行
public class MainClass {
public static void main(String[] args) {
Person person1 = new Person();
List<String> friends = new ArrayList<String>();
friends.add("James");
friends.add("Yao");
person1.setFriends(friends);
Person person2 = person1.clone();
System.out.println(person1.getFriends());
System.out.println(person2.getFriends());
friends.add("Mike");
person1.setFriends(friends);
System.out.println(person1.getFriends());
System.out.println(person2.getFriends());
}
}
对于原型模式一定要把握复制的层数,若是层数越多,就越复杂。