JAVA规划形式(三)-原型
本篇文章主要讲下java 创立型规划形式中的原型形式.
何谓原型形式: 简单来说便是 将一个目标作为原型,经过对其进行仿制而克隆出多个和原型相似的新实例。
使用原型形式,就能够简化实例化的进程, 不必依赖于结构函数或者new关键字.
因为java 提供了clone办法, 原型规划形式的完成就很简单了.
原型形式的要素:
- 原型接口(Prototype Interface): 定义了克隆办法的接口.该办法用于仿制现有目标并创立新目标。
- 原型类(Concrete Prototype Class): 完成了克隆办法,来仿制自身
1: 原型类
详细的完成如下:
package com.zh.xpose;
import java.util.List;
/**
* @Author: zh
* @Time: 23-12-22.
* @Email:
* @Describe:
*/
public class ConcretePrototype implements Cloneable{
private String name;
private List<String> fields;
public ConcretePrototype(String name,List<String> fields) {
System.out.println("原型创立成功");
this.name =name;
this.fields =fields;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<String> getFields() {
return fields;
}
public void setFields(List<String> fields) {
this.fields = fields;
}
@Override
protected Object clone() throws CloneNotSupportedException {
System.out.println("原型仿制成功");
return (ConcretePrototype)super.clone();
}
}
public class JavaTest {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("age");
list.add("sex");
ConcretePrototype concretePrototype = new ConcretePrototype("person",list);
ConcretePrototype clone = null;
try {
clone= (ConcretePrototype) concretePrototype.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
System.out.println(concretePrototype==clone);
System.out.println(concretePrototype.getName() == clone.getName());
System.out.println(concretePrototype.getFields() == clone.getFields());
}
}
输出如下:
exclude patterns:
原型创立成功
原型仿制成功
false
true
true
2: 浅克隆和深克隆
浅克隆只会仿制原型目标自身,而不会仿制它所引证的目标。也便是说,克隆目标和原型目标会共享引证目标。如果原型目标中的引证目标产生改动,克隆目标中的引证目标也会产生改动。
深克隆会仿制原型目标以及它所引证的目标。也便是说,克隆目标和原型目标具有各自独立的引证目标。无论原型目标中的引证目标是否产生改动,克隆目标中的引证目标都不会受到影响。
关于浅克隆:
验证如下:
concretePrototype.setName("test111");
list.add("第三个了");
concretePrototype.setFields(list);
System.out.println(concretePrototype.getName()+" "+clone.getName());
System.out.println(concretePrototype.getFields().size()+" "+clone.getFields().size());
能够看到 当原型类中的list 产生改变时, clone同时产生了改变.
test111 person
3 3
完成深克隆的办法有两种: 经过完成Cloneable接口和经过序列化.
这里经过修正上面的完成类中的clone办法,来完成深克隆.
package com.zh.xpose;
import java.util.ArrayList;
import java.util.List;
/**
* @Author: zh
* @Time: 23-12-22.
* @Email:
* @Describe:
*/
public class ConcretePrototype implements Cloneable{
private String name;
private List<String> fields;
public ConcretePrototype(String name,List<String> fields) {
System.out.println("原型创立成功");
this.name =name;
this.fields =fields;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<String> getFields() {
return fields;
}
public void setFields(List<String> fields) {
this.fields = fields;
}
@Override
protected Object clone() throws CloneNotSupportedException {
System.out.println("原型仿制成功");
ConcretePrototype clone = (ConcretePrototype) super.clone();
clone.setName(new String(name));
clone.setFields(new ArrayList<>(fields));
return clone;
}
}
从头履行验证代码 ,结果输出如下:
原型创立成功
原型仿制成功
false
false
false
test111 person
3 2