一、原型模式
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";}@Overridepublic String desc() {return "牡丹花";}
}// 梅花类
public class Plum extends Flower {public Plum(){this.name = "plum";}@Overridepublic 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方法时,抽象父类中必须重写,否则无法调用。
学海无涯苦作舟!!!