在线代理浏览器网站,制作小游戏的软件,纪检监察信息网站建设,小程序diy制作平台1、定义 原型模式是一种创建型模式#xff0c;用于创建重复的对象#xff0c;并且保证性能。原型模式创建的对象是由原型对象自身创建的#xff0c;是原型对象的一个克隆#xff0c;和原型对象具有相同的结构和相同的值。
2、适用场景
创建对象时我们不仅仅需要创建一个新…1、定义 原型模式是一种创建型模式用于创建重复的对象并且保证性能。原型模式创建的对象是由原型对象自身创建的是原型对象的一个克隆和原型对象具有相同的结构和相同的值。
2、适用场景
创建对象时我们不仅仅需要创建一个新的对象可能我们还需要对象创建出来里面的值和某一个对象也要完全一致原型模式可以保证结构和值都相同。创建对象时我们希望对创建出来的对象的修改不影响到原来的对象可能通过原型模式进行创建进行深度克隆。创建对象时如果对象是个复杂对象里面又包含了其他的复杂对象我们希望创建的对象和原有对象保持一致传统模式new会非常麻烦还需要考虑到里面其他的复杂对象这时候可以使用原型模式进行创建。
3、 原型模式的核心是就是原型类 PrototypePrototype 类需要具备以下两个条件
1实现 Cloneable 接口在 Java 中 Cloneable 接口的作用就是在运行时通知虚拟机可以安全地在实现了 Cloneable 接口的类上使用 clone() 方法只有在实现了 Cloneable 的类才可以被拷贝否则在运行时会抛出 CloneNotSupportedException 异常。2重写 Object 类中的 clone() 方法Java 中所有类的父类都是 ObjectObject 中有一个clone() 方法用于返回对象的拷贝但是其作用域 protected一般的类无法调用因此Prototype 类需要将 clone() 方法的作用域修改为 public。
原型模式是一种比较简单的模式也非常容易理解实现一个接口重写一个方法即完成了原型模式。在实际应用中原型模式很少单独出现。经常与其他模式混用他的原型类Prototype也常用抽象类来替代。
4、注意事项
1使用原型模式复制对象不会调用类的构造函数对象是通过调用 Object 类的 clone() 方法来完成的它直接在内存中复制数据。不但构造函数不会执行甚至连访问权限都对原型模式无效。单例模式中需要将构造函数的访问权限设置为 private但是 clone() 方法直接无视构造方法的权限所以单例模式与原型模式是冲突的在使用时需要注意。
2深拷贝与浅拷贝。Object 类的 clone() 方法只会拷贝对象中的基本的数据类型8种基本数据类型 byte,char,short,int,long,float,double,boolean 和对应的封装类对于数组、容器对象、引用对象等都不会拷贝这就是浅拷贝。如果要实现深拷贝必须将原型模式中的数组、容器对象、引用对象等另行拷贝。
浅拷贝只克隆对象中的基本数据类型而不会克隆数组、容器、引用对象等。换言之浅复制仅仅复制所考虑的对象而不复制它所引用的对象。如果变量为String字符串则拷贝其引用地址但是在修改的时候它会从字符串池中重新生成一个新的字符串原有的字符串对象保持不变。深拷贝把要克隆的对象所引用的对象都克隆了一遍。
代码实例 /*** Author charles.yao* Description* Date 2023/2/13 14:54*/
NoArgsConstructor
AllArgsConstructor
Data
public class Animal implements Cloneable {private String userName;private String userAge;Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}/*** Author charles.yao* Description 浅拷贝类* Date 2023/2/13 14:53*/
NoArgsConstructor
AllArgsConstructor
Data
public class UserInfo implements Cloneable {private String userName;private String userAge;private Animal animal;Overrideprotected UserInfo clone() throws CloneNotSupportedException {UserInfo userInfo (UserInfo) super.clone();userInfo.setAnimal((Animal) animal.clone());return userInfo;}
}/*** Author charles.yao* Description 浅拷贝测试* Date 2023/2/13 14:57*/
public class DeepCopyTest {public static void main(String[] args) {try {UserInfo userInfo new UserInfo();userInfo.setUserName(张三);userInfo.setUserAge(1223);userInfo.setAnimal(new Animal(111, 2122));UserInfo clone userInfo.clone();System.out.println(原数据 userInfo.toString());System.out.println(拷贝之后 clone.toString());System.out.println(userInfo clone);System.out.println(userInfo.getAnimal() clone.getAnimal());userInfo.getAnimal().setUserName(二狗);System.out.println(原数据动物 userInfo.getAnimal().toString());System.out.println(拷贝之后动物 clone.getAnimal().toString());} catch (CloneNotSupportedException e) {e.printStackTrace();}}
}运行结果
原数据UserInfo(userName张三, userAge1223, animalAnimal(userName111, userAge2122))
拷贝之后UserInfo(userName张三, userAge1223, animalAnimal(userName111, userAge2122))
false
false
原数据动物Animal(userName二狗, userAge2122)
拷贝之后动物Animal(userName111, userAge2122)