原型模式

title

原型模式(Prototype Pattern)属于创建型模式,其核心思想是用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象,而不是通过实例化来创建。

原型模式有两种实现方式:浅克隆深克隆

  • 浅克隆只是复制了对象的基本数据类型,而对于引用类型则只是复制了引用地址,而没有真正复制对象本身。这意味着当原型对象的引用类型属性被修改时,所有克隆出来的对象都会受到影响。

  • 深克隆则是对对象及其引用类型的属性都进行复制,这需要对象及其引用类型属性都实现 Serializable 接口,并且通过序列化和反序列化实现深复制。

原型模式的主要角色有:

  • 抽象原型类(Prototype):定义一个克隆自身的接口方法 clone。

  • 具体原型类(Concrete Prototype):实现抽象原型类定义的克隆自身的接口方法。

  • 客户端(Client):通过调用抽象原型类的 clone 方法来创建新的对象。

下面是原型模式的示例代码:

import java.util.ArrayList;

// 抽象原型类
public abstract class Prototype implements Cloneable {
    public abstract Prototype clone();

    private ArrayList<String> list;

    public ArrayList<String> getList() {
        return list;
    }

    public void setList(ArrayList<String> list) {
        this.list = list;
    }
}

// 具体原型类
public class ConcretePrototype extends Prototype {
    public Prototype clone() {
        ConcretePrototype prototype = new ConcretePrototype();
        prototype.setList(this.getList());
        return prototype;
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        ConcretePrototype prototype = new ConcretePrototype();
        ArrayList<String> list = new ArrayList<String>();
        list.add("a");
        list.add("b");
        prototype.setList(list);

        // 克隆新对象
        ConcretePrototype clone = (ConcretePrototype) prototype.clone();
        System.out.println(clone.getList().toString());

        // 修改原型对象的引用类型属性
        prototype.getList().add("c");

        // 克隆对象不受影响
        System.out.println(clone.getList().toString());
    }
}

输出结果为:

[a, b]
[a, b]

在这个示例中,ConcretePrototype 类是具体原型类,实现了抽象原型类 Prototype 的 clone 方法。客户端通过调用抽象原型类的 clone 方法来创建新的对象。同时,客户端可以修改原型对象的引用类型属性,而不会影响克隆出来的对象。

powered by Gitbook© 2023 编外计划 | 最后修改: 2023-11-24 03:37:01

results matching ""

    No results matching ""