学习目标
- 掌握原型模式和建造者模式的应用场景
- 掌握原型模式的浅克隆和深克隆的写法
- 掌握建造者模式的基本写法
- 了解克隆是如何破坏单例的
- 了解原型模式的优、缺点
- 掌握建造者模式和工厂模式的区别
前言
大家一起卷,当当小当家
下面开始学习
一、原型模式的定义
原型模式(prototype pattern)是指原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
调用者不需要指定任何创建细节,不调用构造函数。
属于创建型模式
二、原型模式知识点
原型模式最关键的点为不通过new关键字创建对象,而是通过方法创建对象
通过方法创建的对象会保留原对象的属性以及值,也就是copy或者clone
原型模式的适用场景
- 类初始化消耗资源较多。
- new产生的一个对象需要非常繁琐的过程(数据准备、访问权限等)
- 构造函数比较复杂。
- 循环体中生产大量对象时。
浅克隆与深克隆
浅克隆
- 对应基本数据类型,以及String类型,直接拷贝的值。
- 对于引用数据类型,通过调用clone方法时,将引用类型属性的类的内存地址的值进行copy,并没有将里面具体的元素进行copy,所以调用的时候,修改了克隆对象的值后,会将原型对象的值进行了改变。
- 浅克隆是怎么复制的呢?引用对象在复制的过程中,通过Java底层的字节流来完成复制的,但是JDK底层存在一种机制,当类存在的时候,就不会重新加载,只是将内存地址的值复制过来。而引用对象的值本身就是个内存地址,所以最终只是复制了内存地址,而不是内存地址内对象的值复制过来。
深克隆
- 深克隆可以通过字节流(反序列化)或者json字符串的方式来将对象复制出来,json也是序列化的一种。
- 先把对象转换为json字符串,再将json字符串转换成一个对象。
- 深克隆带来的问题:与单例模式相悖,如果是单例就不要使用克隆,如果是克隆就不要用单例 。
- JDK中实现了克隆的类ArrayList(循环赋值)、HashMap。
总结
原型模式的优点
- 性能优良,Java自带的原型模式是基于内存二进制流的拷贝,比直接new一个对象性能上提升了很多。
- 可以使用深克隆方式保存对象的状态,使用原型模式将对象复制一份并将其状态保存起来,简化了创建过程。
原型模式的缺点
- 必须配备克隆(或者可拷贝)方法。
- 当对已有类进行改造的时候,需要修改代码,违法了开闭原则。
- 深克隆、浅克隆需要运用得当。