JAVA规划形式(三)-原型

本篇文章主要讲下java 创立型规划形式中的原型形式.

何谓原型形式: 简单来说便是 将一个目标作为原型,经过对其进行仿制而克隆出多个和原型相似的新实例。

使用原型形式,就能够简化实例化的进程, 不必依赖于结构函数或者new关键字.

因为java 提供了clone办法, 原型规划形式的完成就很简单了.

原型形式的要素:

  1. 原型接口(Prototype Interface): 定义了克隆办法的接口.该办法用于仿制现有目标并创立新目标。
  2. 原型类(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