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;}@Overrideprotected 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;}@Overrideprotected 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