原型模式介绍:是一种创建型的模式,多用于创建复杂的或者构造耗时的实例,因为在这种情况下复制一个已经存在的实例可使程序运行更高效。
原型模式的定义:用原型实例指定创建对象的种类,并通过复制这些原型创建新的对象。
使用场景:
- 类初始化需要消耗非常多的资源,这个资源包括数据、硬件资源等,通过原型复制避免这些消耗
- 通过new产生一个对象需要非常繁琐的数据准备或访问权限,这时可以使用原型模式。
- 一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑用原型模式复制多个对象共调用者使用,即保护性拷贝。
浅拷贝和深拷贝:
- 关于浅拷贝,并不是将所有字段都重新构造一份,而是copy对象使用了原对象的引用。我们都知道A引用B就是说两个对象指向同一个地址,当修改A时B也会改变,B修改A也会改变。
- 在拷贝对象时,对于引用型的字段也要采用拷贝的形式,,而不是单纯采用引用的形式,这样可以避免操作副本时影响原始对象的问题。
Android源码中的原型模式实现
- ArrayList源码
- Intent源码
后面,作者通过Intent源码引出了Intent跳转的逻辑实现,分析了PMS的源码,即从开机启动开始PMS初始化并扫描手机中的系统软件及三方应用,从而获取各安装包中Manifest中注册的所有四大组件:Activity、Service、BroadcastReceiver、ContentProvider列表。当需要跳转时,就是从列表中找到对应intent条件的组建进行跳转。
小结:
原型模式本质上就是对象拷贝,于C++中的拷贝构造函数有些类似,它们之间容易出现的问题也都是深拷贝和浅拷贝。使用原型模式可以解决构造复杂对象的资源消耗问题,能够在某些场景下提升创建对象的效率。还有一个重要用途就是保护性拷贝,也就是某个对象对外可能是只读的,为了防止外部对这个只读对象修改,可以通过返回一个对象拷贝的形式实现只读的限制。
优点:原型模式是在内存中二进制流的拷贝,要比直接new一个对象性能要好很多,特别是要在一个循环体内产生大量的对象时,原型模式建议更好地体现其优点
缺点:这既是它的优点也是缺点,直接在内存中拷贝,构造函数是不会执行的,在实际开发当中应该注意这个潜在的问题。
网友评论