创建者模式--原型模式
作者:互联网
概述
用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象
结构
原型模式包含如下角色:
- 抽象原型类: 规定了具体原型对象必须实现的clone()方法
- 具体原型类: 实现抽象原型类的clone()方法,他是可被复制的对象
- 访问类: 使用具体原型类中的clone()方法来复制新的对象
类图:
实现
原型模式的克隆分为浅克隆和深克隆
浅克隆:创建一个对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址
深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不在指向原有对象地址
java中Object类中提供了clone()方法来实现浅克隆,Cloneable接口是上面类图中的抽象原型类,而实现了Cloneable接口的子实现类就是具体的原型类.代码如下
public class Realizetype implements Cloneable{ public Realizetype() { System.out.println("具体的原型对象创建成功!"); } @Override protected Realizetype clone() throws CloneNotSupportedException { System.out.println("具体原型复制成功"); return (Realizetype)super.clone(); } } public static void main(String[] args) throws CloneNotSupportedException { Realizetype realizetype = new Realizetype(); Realizetype clone = realizetype.clone(); System.out.println("原型对象和克隆对象是不是同一个对象:" + (realizetype == clone)); }
案例
用原型模式生成"三好学生"奖状
同一学校三好学生奖状除了获奖人名不同,其他都相同,可以使用原型模式复制多个三好学生奖状出来,然后修改奖状的名字即可
类图:
@Data public class Citation implements Cloneable{ private String name; @Override protected Citation clone() throws CloneNotSupportedException { return (Citation) super.clone(); } public void show(){ System.out.println(name + "同学:在2022第一学期中表现优秀,特发此奖"); } } class Client{ public static void main(String[] args) throws CloneNotSupportedException { Citation citation = new Citation(); Citation clone = citation.clone(); citation.setName("张三"); clone.setName("李四"); citation.show(); clone.show(); } }
使用场景
- 对象的创建非常复杂,可以使用原型模式快捷的创建对象
- 性能和安全要求比较高
拓展(深克隆)
@Data public class Citation implements Cloneable, Serializable { private Student student; @Override protected Citation clone() throws CloneNotSupportedException { return (Citation) super.clone(); } public void show() { System.out.println(student.getName() + "同学:在2022第一学期中表现优秀,特发此奖"); } } @Data class Student implements Serializable { private String name; } class Client { public static void main(String[] args) throws Exception { Citation citation = new Citation(); Student student = new Student(); student.setName("张三"); citation.setStudent(student); //创建对象输出流对象 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\data\\a.txt")); //写对象 oos.writeObject(citation); //关闭资源 oos.close(); //创建对象输入流对象 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\data\\a.txt")); //读取对象 Citation citation1 = (Citation) ois.readObject(); //释放资源 ois.close(); Student student1 = citation1.getStudent(); student.setName("李四"); citation.show(); citation1.show(); } }
注意:都需要实现Serializable接口
标签:创建者,--,clone,Citation,模式,对象,原型,new,public 来源: https://www.cnblogs.com/lpzjava/p/16639447.html