原型模式
原型模式(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 方法来创建新的对象。同时,客户端可以修改原型对象的引用类型属性,而不会影响克隆出来的对象。