原型模式
简介:是用于创建重复的对象,同时又能保证性能。
针对于原型实例对象的种类,根据该对象克隆创建一个新对象。
浅克隆
弊端:值类型属性变化时不会影响克隆的对象,引用类型属性变化时会影响克隆对象。
package com.xm.designpattern.prototype;
import java.util.ArrayList;
import java.util.List;
/**
* java设计模式-原型模式(浅克隆)
* @author ouyangjun
*/
public class EasyPrototype implements Cloneable {
private String name;
private List<String> list;
public EasyPrototype(){}
public EasyPrototype(String name, List<String> list){
this.name = name;
this.list = list;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
@Override
protected Object clone() throws CloneNotSupportedException {
// 直接继承父类克隆
return super.clone();
}
/**
* 测试
* @param args
* @throws CloneNotSupportedException
*/
public static void main(String[] args) throws CloneNotSupportedException {
String name = "ouyangjun";
List<String> list = new ArrayList<String>();
list.add("1111");
list.add("2222");
// 初始化一个对象
EasyPrototype easy1 = new EasyPrototype(name, list);
// 克隆一个对象
EasyPrototype easy2 = (EasyPrototype)easy1.clone();
System.out.println("easy1对象: " + easy1.getName() + " " + easy1.getList());
System.out.println("easy2对象: " + easy2.getName() + " " + easy2.getList());
System.out.println("------------------------------");
// 清空集合,重新赋值
list.clear();
list.add("8888");
list.add("9999");
System.out.println("easy1对象: " + easy1.getName() + " " + easy1.getList());
System.out.println("easy2对象: " + easy2.getName() + " " + easy2.getList());
// 根据控制台结果可以看出,值类型变量变化时不会影响克隆的对象,引用类型变量变化时会影响克隆对象
}
}
浅克隆打印效果图如下:
深克隆
package com.xm.designpattern.prototype;
import java.util.ArrayList;
/**
* java设计模式-原型模式(深克隆)
* @author ouyangjun
*/
public class DeepPrototype implements Cloneable {
private String name;
// 由于List不能clone, 只能声明ArrayList, 效果是一样的
private ArrayList<String> arrayList;
public DeepPrototype(){}
public DeepPrototype(String name, ArrayList<String> arrayList){
this.name = name;
this.arrayList = arrayList;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public ArrayList<String> getArrayList() {
return arrayList;
}
public void setArrayList(ArrayList<String> arrayList) {
this.arrayList = arrayList;
}
@Override
protected Object clone() throws CloneNotSupportedException {
Object object = super.clone();
// 对象克隆
DeepPrototype deep = (DeepPrototype)object;
// 属性也克隆
deep.arrayList = (ArrayList<String>)this.arrayList.clone();
// 返回对象
return object;
}
/**
* 测试
* @param args
* @throws CloneNotSupportedException
*/
public static void main(String[] args) throws CloneNotSupportedException {
String name = "ouyangjun";
ArrayList<String> arrayList = new ArrayList<String>();
arrayList.add("1111");
arrayList.add("2222");
// 初始化一个对象
DeepPrototype deep1 = new DeepPrototype(name, arrayList);
// 克隆一个对象
DeepPrototype deep2 = (DeepPrototype)deep1.clone();
System.out.println("deep1对象: " + deep1.getName() + " " + deep1.getArrayList());
System.out.println("deep2对象: " + deep2.getName() + " " + deep2.getArrayList());
System.out.println("------------------------------");
// 清空集合,重新赋值
arrayList.clear();
arrayList.add("8888");
arrayList.add("9999");
System.out.println("deep1对象: " + deep1.getName() + " " + deep1.getArrayList());
System.out.println("deep2对象: " + deep2.getName() + " " + deep2.getArrayList());
}
}
深克隆打印效果图如下:
本章完结,待续!
本文说明:该文章属于原创,如需转载,请标明文章转载来源