JAVA设计模式(三)-原型
本篇文章主要讲下java 创建型设计模式中的原型模式.
何谓原型模式: 简单来说就是 将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。
使用原型模式,就可以简化实例化的过程, 不必依赖于构造函数或者new关键字.
由于java 提供了clone方法, 原型设计模式的实现就很简单了.
原型模式的要素:
- 原型接口(Prototype Interface): 定义了克隆方法的接口.该方法用于复制现有对象并创建新对象。
- 原型类(Concrete Prototype Class): 实现了克隆方法,来复制自身
1: 原型类
具体的实现如下:
java
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();
}
}
java
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());
}
}
输出如下:
java
exclude patterns:
原型创建成功
原型复制成功
false
true
true
2: 浅克隆和深克隆
浅克隆只会复制原型对象本身,而不会复制它所引用的对象。也就是说,克隆对象和原型对象会共享引用对象。如果原型对象中的引用对象发生改变,克隆对象中的引用对象也会发生改变。
深克隆会复制原型对象以及它所引用的对象。也就是说,克隆对象和原型对象拥有各自独立的引用对象。无论原型对象中的引用对象是否发生改变,克隆对象中的引用对象都不会受到影响。
关于浅克隆:
验证如下:
java
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同时发生了变更.
java
test111 person
3 3
实现深克隆的方式有两种: 通过实现Cloneable接口和通过序列化.
这里通过修改上面的实现类中的clone方法,来实现深克隆.
java
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;
}
}
重新执行验证代码 ,结果输出如下:
arduino
原型创建成功
原型复制成功
false
false
false
test111 person
3 2