原型模式 逃离我推掉我的手 2021-07-24 16:03 276阅读 0赞 # 一 点睛 # 用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象。 # 二 结构 # 原型模式包含如下角色: * 抽象原型类:规定了具体原型对象必须实现的的 clone() 方法。 * 具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。 * 访问类:使用具体原型类中的 clone() 方法来复制新的对象。 类图 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NoZW5ncWl1bWluZw_size_16_color_FFFFFF_t_70] # 三 实现 # 原型模式的克隆分为浅克隆和深克隆。 > 浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。 > > 深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。 Java中的Object类中提供了 `clone()` 方法来实现浅克隆。 Cloneable 接口是上面的类图中的抽象原型类,而实现了Cloneable接口的子实现类就是具体的原型类。代码如下: **Realizetype(具体的原型类):** public class Realizetype implements Cloneable { public Realizetype() { System.out.println("具体的原型对象创建完成!"); } @Override protected Realizetype clone() throws CloneNotSupportedException { System.out.println("具体原型复制成功!"); return (Realizetype) super.clone(); } } **PrototypeTest(测试访问类):** public class PrototypeTest { public static void main(String[] args) throws CloneNotSupportedException { Realizetype r1 = new Realizetype(); Realizetype r2 = r1.clone(); System.out.println("对象r1和r2是同一个对象?" + (r1 == r2)); } } 测试结果 具体的原型对象创建完成! 具体原型复制成功! 原型对象和克隆出来的是否是同一个对象?false # 四 案例 # **用原型模式生成“三好学生”奖状** 同一学校的“三好学生”奖状除了获奖人姓名不同,其他都相同,可以使用原型模式复制多个“三好学生”奖状出来,然后在修改奖状上的名字即可。 类图如下: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NoZW5ncWl1bWluZw_size_16_color_FFFFFF_t_70 1] 代码如下: // 奖状类 public class Citation implements Cloneable { private String name; public void setName(String name) { this.name = name; } public String getName() { return (this.name); } public void show() { System.out.println(name + "同学:在2020学年第一学期中表现优秀,被评为三好学生。特发此状!"); } @Override public Citation clone() throws CloneNotSupportedException { return (Citation) super.clone(); } } // 测试访问类 public class CitationTest { public static void main(String[] args) throws CloneNotSupportedException { Citation c1 = new Citation(); c1.setName("张三"); // 复制奖状 Citation c2 = c1.clone(); // 将奖状的名字修改李四 c2.setName("李四"); c1.show(); c2.show(); } } 测试结果 张三同学:在2020学年第一学期中表现优秀,被评为三好学生。特发此状! 李四同学:在2020学年第一学期中表现优秀,被评为三好学生。特发此状! # 五 使用场景 # * 对象的创建非常复杂,可以使用原型模式快捷的创建对象。 * 性能和安全要求比较高。 # 六 浅拷贝 # Citation public class Citation implements Cloneable { private Student stu; public Student getStu() { return stu; } public void setStu(Student stu) { this.stu = stu; } @Override public Citation clone() throws CloneNotSupportedException { return (Citation) super.clone(); } public void show() { System.out.println(stu.getName() + "同学:在2020学年第一学期中表现优秀,被评为三好学生。特发此状!"); } } Student public class Student { // 学生的姓名 private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + '}'; } } CitaionTest public class CitaionTest { public static void main(String[] args) throws CloneNotSupportedException { // 1 创建原型对象 Citation citation = new Citation(); // 创建张三学生对象 Student stu = new Student(); stu.setName("张三"); citation.setStu(stu); // 2 克隆奖状对象 Citation citation1 = citation.clone(); Student stu1 = citation1.getStu(); stu1.setName("李四"); /*citation.setName("张三"); citation1.setName("李四");*/ // 3 调用show方法展示 citation.show(); citation1.show(); } } 测试结果 李四同学:在2020学年第一学期中表现优秀,被评为三好学生。特发此状! 李四同学:在2020学年第一学期中表现优秀,被评为三好学生。特发此状! 说明: stu对象和stu1对象是同一个对象,就会产生将stu1对象中name属性值改为“李四”,两个Citation(奖状)对象中显示的都是李四。这就是浅克隆的效果,对具体原型类(Citation)中的引用类型的属性进行引用的复制。这种情况需要使用深克隆,而进行深克隆需要使用对象流。代码如下: # 七 扩展(深克隆) # // 奖状类 public class Citation implements Cloneable { private Student stu; public Student getStu() { return stu; } public void setStu(Student stu) { this.stu = stu; } void show() { System.out.println(stu.getName() + "同学:在2020学年第一学期中表现优秀,被评为三好学生。特发此状!"); } @Override public Citation clone() throws CloneNotSupportedException { return (Citation) super.clone(); } } // 学生类 public class Student implements Serializable { // 学生的姓名 private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + '}'; } } // 测试类 public class CitaionTest { public static void main(String[] args) throws Exception { // 1 创建原型对象 Citation citation = new Citation(); // 创建张三学生对象 Student stu = new Student(); stu.setName("张三"); citation.setStu(stu); // 创建对象输出流对象 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("d:/a.txt")); // 写对象 oos.writeObject(citation); // 释放资源 oos.close(); // 创建对象输入流对象 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d:/a.txt")); // 读取对象 Citation citation1 = (Citation) ois.readObject(); // 释放资源 ois.close(); Student stu1 = citation1.getStu(); stu1.setName("李四"); citation.show(); citation1.show(); } } 运行结果为: 张三同学:在2020学年第一学期中表现优秀,被评为三好学生。特发此状! 李四同学:在2020学年第一学期中表现优秀,被评为三好学生。特发此状! > 注意:Citation类和Student类必须实现Serializable接口,否则会抛NotSerializableException异常。 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NoZW5ncWl1bWluZw_size_16_color_FFFFFF_t_70]: /images/20210724/3dc3364faf5c48ce902892164c8c4ff8.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NoZW5ncWl1bWluZw_size_16_color_FFFFFF_t_70 1]: /images/20210724/99c656a2881545f6adb6c98046b09c8b.png
相关 原型模式 public class Phone implements Cloneable { private String toPhoneNumber; 柔情只为你懂/ 2022年03月31日 08:16/ 0 赞/ 192 阅读
相关 原型模式 一. 原型模式简介 原型模式(Prototype Pattern)也是一种创建型模式,它关注的是大量相似对象的创建问题。我们经常会遇到这样的情况:在系统中要创建大量的 超、凢脫俗/ 2022年02月21日 12:16/ 0 赞/ 220 阅读
相关 原型模式 对象浅拷贝 实现Clonable接口,重写clone方法,jvm的本地方法实现拷贝 Object protected native Object clone() 女爷i/ 2021年12月12日 11:39/ 0 赞/ 258 阅读
相关 原型模式 原型模式(Prototype Pattern):通过原型实例指定创建对象的种类,并且通过克隆这些原型来创建新的对象。原型模式是一种创建型模式 完成原型模式一般需要3个角 落日映苍穹つ/ 2021年12月05日 01:03/ 0 赞/ 218 阅读
相关 原型模式 原型模式 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种 「爱情、让人受尽委屈。」/ 2021年09月29日 16:10/ 0 赞/ 313 阅读
相关 原型模式 原型模式:用原型实例指定创建指定对象的种类,并且通过复制这些原型创建新的对象,同时又能保证性能。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价 骑猪看日落/ 2021年09月17日 01:08/ 0 赞/ 307 阅读
相关 原型模式 5.原型模式 ![70][] class Program { static void Main(string[] arg 痛定思痛。/ 2021年09月16日 23:52/ 0 赞/ 337 阅读
相关 原型模式 原型模式 定义 在软件系统中,有时需要多次创建某一类型的对象,为了简化创建过程,可以只创建一个对象,然后通过对象克隆的方式复制出多个相同的对象,这就是原型设计模 野性酷女/ 2021年07月24日 20:41/ 0 赞/ 474 阅读
相关 原型模式 型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式是实现了... 小灰灰/ 2020年06月13日 05:37/ 0 赞/ 722 阅读
还没有评论,来说两句吧...