# 23种设计模式-原型模式
# 1.原型模式
用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。
# 优缺点
# 优点:
性能优良:原型模式是在内存二进制流的复制,要比直接new一个对象性能好,特别是在一个循环体内产生大量的对象时,原型模式可以更好地体现其优点。 逃避构造函数的约束:这既是优点也是缺点,直接在内存中复制,构造函数是不会执行的,因此减少了约束,需要在实际应用时进行权衡考虑。
# 缺点:
配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。 必须实现 Cloneable 接口。 在实现深克隆时需要编写较为复杂的代码。
# 使用场景
# 实现方式
#
public abstract class Prototype implements Cloneable {
protected ArrayList<String> list = new ArrayList<String>();
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
public abstract void show();
}
#
public class ShallowClone extends Prototype {
@Override
public Prototype clone(){
Prototype prototype = null;
try {
prototype = (Prototype)super.clone();
}
catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return prototype;
}
@Override
public void show(){
System.out.println("浅克隆");
}
}
public class DeepClone extends Prototype {
@SuppressWarnings("unchecked")
@Override
public Prototype clone() {
Prototype prototype = null;
try {
prototype = (Prototype)super.clone();
}
catch (CloneNotSupportedException e) {
e.printStackTrace();
}
prototype.list = (ArrayList<String>) this.list.clone();
return prototype;
}
@Override
public void show(){
System.out.println("深克隆");
}
}
public class Client {
public static void main(String[] args) {
ShallowClone cp = new ShallowClone();
ShallowClone clonecp = (ShallowClone) cp.clone();
clonecp.show();
System.out.println(clonecp.list == cp.list);
DeepClone cp2 = new DeepClone();
DeepClone clonecp2 = (DeepClone) cp2.clone();
clonecp2.show();
System.out.println(clonecp2.list == cp2.list);
}
}
参考博客:https://blog.csdn.net/a745233700/article/details/83625951