一、什么是原型模式?
原型模式是创建型模式的一种,其特点在于通过“复制”一个已经存在的实例来返回新的实例,而不是新建实例。被复制的实例就是我们所称的“原型”,这个原型是可定制的。
二、应用场景
1、在创建对象的时候,我们不只是希望被创建的对象继承其基类的基本结构,还希望继承原型对象的数据。
2、希望对目标对象的修改不影响既有的原型对象(深度克隆的时候可以互不影响)。
3、隐藏克隆操作的细节。很多时候对对象本身的克隆需要涉及到类本身的数据细节。
原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效;或者创建值相等,只是命名不一样的同类数据。
三、具体代码:
import java.util.ArrayList;
import java.util.List;
/**
* @Title: People.java
* @Package
* @Description:实现Cloneable的People类
* @author xiaozhi
* @date 2016年12月1日 下午5:48:49
* @version V1.0
*/
// 定义该类为可克隆的
public class People implements Cloneable {
private String name;
private String sex;
private int age;
private List<String> friends;
/**
* @return friends
*/
public List<String> getFriends() {
return friends;
}
/**
* @param friends
* 要设置的 friends
*/
public void setFriends(List<String> friends) {
this.friends = friends;
}
/**
* @return name
*/
public String getName() {
return name;
}
/**
* @param name
* 要设置的 name
*/
public void setName(String name) {
this.name = name;
}
/**
* @return sex
*/
public String getSex() {
return sex;
}
/**
* @param sex
* 要设置的 sex
*/
public void setSex(String sex) {
this.sex = sex;
}
/**
* @return age
*/
public int getAge() {
return age;
}
/**
* @param age
* 要设置的 age
*/
public void setAge(int age) {
this.age = age;
}
/**
* 浅度克隆
*
* 只能克隆基本的数据属性,对于对象,集合不能克隆
*/
public People clone() {
try {
// clone为object基类的方法
return (People) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
}
/**
* 深度克隆 @Title: clone1 @Description:
* 完全实现对目标对象的修改不影响既有的原型对象,也就是深度克隆 @param @return 设定参数 @return People
* 返回类型 @throws
*/
public People clone1() {
try {
// 先克隆一个people
People people = (People) super.clone();
// 新建一个friends 集合。
List<String> newfriends = new ArrayList<String>();
// 把接受到的friends集合遍历赋值给新集合
for (String friend : this.getFriends()) {
newfriends.add(friend);
}
// 将该集合添加到克隆的people中
people.setFriends(newfriends);
// 返回克隆的对象
return people;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
}
}
import java.util.ArrayList;
import java.util.List;
/**
* @Title: MainClass.java
* @Package
* @Description: 测试类
* @author xiaozhi
* @date 2016年12月1日 下午5:49:02
* @version V1.0
*/
public class MainClass {
public static void main(String[] args) {
// People p=new People();
// p.setName("张三");
// p.setAge(20);
// p.setSex("男");
//
// System.out.println(p.getName());
// System.out.println(p.getSex());
// System.out.println(p.getAge());
// 浅度克隆
// People p1=p.clone();
// p1.setName("李四");
// System.out.println(p1.getName());
// System.out.println(p1.getSex());
// System.out.println(p1.getAge());
// People p=new People();
// List<String> friends=new ArrayList<String>();
// friends.add("Jame");
// friends.add("Love");
//
// p.setFriends(friends);
// 验证在使用浅度克隆集合或对象时,会出现的结果(结果:对目标对象的修改影响既有的原型对象的值)
// People p1=p.clone();
// System.out.println(p.getFriends());
// System.out.println(p1.getFriends());
//
// friends.add("Kally");
// p.setFriends(friends);
// System.out.println(p.getFriends());
// System.out.println(p1.getFriends());
People p = new People();
List<String> friends = new ArrayList<String>();
friends.add("Jame");
friends.add("Love");
p.setFriends(friends);
People p1 = p.clone1();
System.out.println(p.getFriends());
System.out.println(p1.getFriends());
friends.add("Kally");
p.setFriends(friends);
System.out.println(p.getFriends());
System.out.println(p1.getFriends());
}
}
四、测试结果:
[Jame, Love]
[Jame, Love]
[Jame, Love, Kally]
[Jame, Love]