什么是原型模式
⽤原型实例指定创建对象的种类,并且通过拷⻉这些原型创建新的对象
代码实例
public class Prototype implements Cloneable {
private String name;
private Integer age;
public Prototype(String name, Integer age) {
this.name = name;
this.age = age;
System.out.println("正在创建");
}
@Override
protected Prototype clone() {
try {
return (Prototype) super.clone();
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
public static void main(String[] args) {
Prototype p = new Prototype("张三", 18);
System.out.println(p.name + "," + p.age);
Prototype clone = p.clone();
System.out.println(clone.name + "," + clone.age);//张三,18
System.out.println("对象引用一致吗?" + (clone == p));//false
System.out.println("String属性引用一致吗?" + (clone.name == p.name));//true
clone.name="李四";
System.out.println(p.name + "," + p.age);//张三,18
System.out.println(clone.name + "," + clone.age);//李四,18
System.out.println(clone.name == p.name);//false
}
}
原型模式实际上就是实现Cloneable接⼝,重写clone()⽅法。
-
性能优良
原型模式是在内存⼆进制流的拷⻉,要⽐直接new⼀个对象性能好很多,特别是 要在⼀个循环体内产⽣⼤量的对象时,原型模式可以更好地体现其优点。 -
逃避构造函数的约束
这既是它的优点也是缺点,直接在内存中拷⻉,构造函数是不会执⾏的。
使用场景
-
资源优化场景类初始化需要消化⾮常多的资源,这个资源包括数据、硬件资源等。
-
性能和安全要求的场景通过new产⽣⼀个对象需要⾮常繁琐的数据准备或访问权限,则可以使⽤原型模式。
-
⼀个对象多个修改者的场景 ⼀个对象需要提供给其他对象访问,⽽且各个调⽤者可能都需要修改其值时,可以考虑使⽤原型模式拷⻉多个对象供调⽤者使⽤。
扩展延伸
学习原型模式,必须要了解两个概念:浅拷贝,深拷贝。
浅拷贝 :只复制指向某个对象的指针,而不复制对象本身,相当于是新建了一个对象,该对象复制了原对象的指针,新旧对象还是共用一个内存块。
深拷贝:是新建一个一模一样的对象,该对象与原对象不共享内存,修改新对象也不会影响原对象。
在java中的浅拷贝与深拷贝:
结合这张图,你能理解代码片段的输出结果了吗?
- 本文链接: https://www.sunce.wang/archives/she-ji-mo-shi-zhi-yuan-xing-mo-shi
- 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!