您的位置:首页 > 移动开发 > Android开发

设计模式_原型模式

2016-03-11 09:24 411 查看
原型模式

1、定义

定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。

原型是一个创建型的模式。原型二字表明了该模式应该有一个样板实例,用户从这个样板对象中复制出一个内部属性一致的对象,这个过程也就是我们俗称的“克隆”。被复制的实例就是我们所称的“原型”,这个原型是可定制的。

原型模式多用于创建复制的或者构造耗时的实例,因为这种情况下,复制一个已经存在的实例可使程序运行更加高效。

2、使用场景

1)、类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等,通过原型拷贝避免这些消耗。

2)、通过new产生一个对象需要非常频繁地数据准备或访问权限,这时可以使用原型模式。

3)、一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用,即保护性拷贝。

注意:通过实现Cloneable接口的原型模式在调用clone函数构造实例时并不一定比通过new操作速度快,只有通过new构造对象较为耗时或者说成本较高时,通过clone方法才能够获得效率上的提升。

3UML类图

角色介绍:

Client:客户端用户

Prototype:抽象类或者接口,声明具备clone能力,cloneable接口。

ConcretePrototype:具体的原型类



4、代码示例

见ArrayList源码与Intent源码!

需要注意的是,通过clone拷贝对象时并不会执行构造函数!

浅拷贝,也称影子拷贝,多个引用指向同一个对象。

深拷贝,在拷贝对象时,对于引用型的字段也要采用拷贝的形式,而不是单纯引用的形式。

原型模式是一个非常简单的一个模式,它的核心问题就是对原始对象进行拷贝,在这个模式的使用过程中需要注意的一点就是:深、浅拷贝的问题。

使用clone和new需要根据构造对象的成本决定,如果对象的构造成本比较高或者构造较为麻烦,那么使用clone()函数效率比较高,否则可以使用new的形式。

5、总结

原型模式本质上是对象拷贝,使用原型模式可以解决构建复杂对象的资源消耗问题,能够在某些场景下提升创建对象的效率。还有一个重要的用途就是保护性拷贝,也就是某个对象对外可能是只读的,为了防止外部对这个只读对象修改。

优点:

原型模式是在内存中二进制流的拷贝,要比直接new一个对象性能好很多,特别是要在一个循环体内产生大量的对象时,原型模式可以更好地体现其优点。

缺点:

这既是它的优点也是缺点,直接在内存中拷贝,构造函数是不会执行的,在实际开发中应该注意这个潜在的问题。优点就是减少约束,缺点也是减少了约束,需要大家在实际应用时考虑。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息