一、原型模式
1、原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能比较好。一般对付出较大代价获取到的实体对象进行克隆操作,可以提升性能。
2、实现思路:
(1)、需要克隆的实体类实现Cloneable接口
(2)、复写clone方法(当前对象本身可以不复写,如果当前对象被继承,需要clone子类,则必须要复写)
二、代码示例
1、基础示例:
import lombok.Data;
@Data
public class Rose implements Cloneable {
private String name;
public static void main(String[] args) throws CloneNotSupportedException {
Rose rose = new Rose();
rose.setName("玫瑰");
System.out.println(rose);
Rose clone = (Rose)rose.clone();
System.out.println(clone);
System.out.println(rose==clone);
}
}
上运行结果:
可以看出,完整的复制了属性,且并不是同一个对象。实现了Cloneable接口的类可以直接用clone方法。
2、继承示例:
// 花抽象类
import lombok.Data;
@Data
public abstract class Flower implements Cloneable{
protected String name;
public abstract String desc();
public Object clone() {
Object clone = null;
try {
clone = super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return clone;
}
}
// 牡丹花类
public class Peony extends Flower {
public Peony(){
this.name = "peony";
}
@Override
public String desc() {
return "牡丹花";
}
}
// 梅花类
public class Plum extends Flower {
public Plum(){
this.name = "plum";
}
@Override
public String desc() {
return "梅花";
}
}
// 测试类
public class Ztest {
public static void main(String[] args) {
Flower plum = new Plum();
System.out.println(plum);
Flower clone = (Flower) plum.clone();
System.out.println(clone);
System.out.println(plum==clone);
}
}
运行结果:
可以看到运行结果,可以看到完成克隆,且并非同一个对象。子类在调用clone方法时,抽象父类中必须重写,否则无法调用。
学海无涯苦作舟!!!