原型模式(Prototype)
定义:
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
工作原理:
通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。
理解:
原型模式,顾名思义,通过一个原型模板,依葫芦画瓢得到另一个新的对象。
即通过一个已经存在的对象,复制出更多的具有与此对象具有相同类型的新的对象。
Java中对象的复制可以通过克隆完成。所以我们需先对克隆有所了解。
Java中有基本数据类型和引用类型之分。基本数据类型存放的是数值本身,引用类型存放的是数据的引用(类似指针)。
1、浅复制
基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。String是class对象,所以为引用类型,但因为String是final的且加之JVM对String优化,因此修改了克隆对象的String类型值后,原型对象的String类型之不会发生改变。Object的clone()方法默认为浅复制。
public class ShallowClone { public static void main(String[] args) throws CloneNotSupportedException { Course course = new Course("语文"); Student stuA = new Student(); stuA.setAge(11); stuA.setName("张三"); stuA.setCourse(course); System.out.println("修改值前:"); System.out.println("stuA:"+ stuA.toString()); Student stuB = stuA.clone(); System.out.println("stuB:"+ stuB.toString()); stuB.setAge(22); stuB.setName("李四"); stuB.setCourseName("数学"); System.out.println("\n\n修改值后:"); System.out.println("stuA:"+ stuB.toString()); System.out.println("stuB:"+ stuA.toString()); } } class Student implements Cloneable{ private int age; private String name; private Course course; @Override protected Student clone() throws CloneNotSupportedException { return (Student)super.clone(); } @Override public String toString() { return "年龄:" + this.age + "\t姓名:" + this.getName() + "\t选修课程:"+ this.getCourse().getName(); } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Course getCourse() { return course; } public void setCourse(Course course) { this.course = course; } public void setCourseName(String name) { this.course.setName(name); } } class Course{ private String name; public Course(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
打印结果:
修改值前: stuA:年龄:11 姓名:张三 选修课程:语文 stuB:年龄:11 姓名:张三 选修课程:语文 修改值后: stuA:年龄:22 姓名:李四 选修课程:数学 stuB:年龄:11 姓名:张三 选修课程:数学
对于引用类型,原型对象和克隆对象指向了相同的引用。所以修改引用类型的值后,原型对象和克隆对象都会随之改变。
2、深复制
深复制是完全拷贝,克隆对象与原型对象的引用类型的值都指向了不同的实例,因此修改克隆或原型的引用类型值也不会相互影响。上述实例只需要修改clone方法,即可改为深复制。
package prototype.deep; public class DeepClone { public static void main(String[] args) throws CloneNotSupportedException { Course course = new Course("语文"); Student stuA = new Student(); stuA.setAge(11); stuA.setName("张三"); stuA.setCourse(course); System.out.println("修改值前:"); System.out.println("stuA:"+ stuA.toString()); Student stuB = stuA.clone(); System.out.println("stuB:"+ stuB.toString()); stuB.setAge(22); stuB.setName("李四"); stuB.setCourseName("数学"); System.out.println("\n\n修改值后:"); System.out.println("stuA:"+ stuB.toString()); System.out.println("stuB:"+ stuA.toString()); } } class Student implements Cloneable{ private int age; private String name; private Course course; @Override protected Student clone() throws CloneNotSupportedException { Student stu = (Student)super.clone(); Course cou = new Course(stu.getCourse().getName()); stu.setCourse(cou); return stu; } @Override public String toString() { return "年龄:" + this.age + "\t姓名:" + this.getName() + "\t选修课程:"+ this.getCourse().getName(); } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Course getCourse() { return course; } public void setCourse(Course course) { this.course = course; } public void setCourseName(String name) { this.course.setName(name); } } class Course{ private String name; public Course(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
打印:
修改值前: stuA:年龄:11 姓名:张三 选修课程:语文 stuB:年龄:11 姓名:张三 选修课程:语文 修改值后: stuA:年龄:22 姓名:李四 选修课程:数学 stuB:年龄:11 姓名:张三 选修课程:语文
相关推荐
设计模式之原型模式prototype有更多需要请联系我wyb_jany@126.com
原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
主要介绍了PHP设计模式:原型模式Prototype,结合实例形式详细分析了PHP原型模式Prototype的基本概念、功能、原理、实现方法与操作注意事项,需要的朋友可以参考下
设计模式C++学习之原型模式(Prototype)
即原型模式,提供一个已经存在的对象进行新对象创建的接口,一般情况下都是使用Clone接口。 此模式非常简单,简单的说就是复制多个当前对象供使用。Prototype模式允许一个对象再创建另外一个可定制的对象,根本...
6、原型模式(Prototype Pattern) 用意:通过拷贝创建一个新的对象
原型模式的示例代码和文档,学习原型模式的参考资料。
NULL 博文链接:https://hnzhoujunmei.iteye.com/blog/1032892
一个原型设计模式的应用案例,C#语言编写,有助于设计模式的理解和学以致用。
原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
原型模式是一种创建型设计模式,它通过复制一个现有的对象来创建新的对象,而不是通过调用构造函数的方式。这种方式可以在运行时动态地创建和修改对象,而不需要知道具体的创建细节 。 原型模式的基本概念包括以下...
3.设计模式Design Pattern:创建型模式(厂模式Factory、抽象工厂模式Abstract Factory、单例模式Singleton、建造者模式Builder、原型模式Prototype和对象池模式Object Pool Pattern)、结构型模式(适配器模式、...
IOS设计模式浅析之原型模式(Prototype)--copy - iOS知识库1
NULL 博文链接:https://gary0416.iteye.com/blog/904124
NULL 博文链接:https://jacky-dai.iteye.com/blog/2295379
原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当...
C#面向对象设计模式纵横谈(6):Prototype 原型模式(创建型模式) 体验课程
概述 原型模式是指原型实例指向创建对象的种类,并通过拷贝这些原型创建新的对象,是一种用来创建对象的模式,也就是创建一个对象作为另一个对象的prototype属性; prototype警告:学习了解原型模式前需先学习...
prototype原型模式,通过拷贝构造函数,实现复制一个与现有对象一样的对象