参考资料:
http://www.codingdict.com/article/8717
https://my.oschina.net/u/3865831/blog/2998468
https://www.cnblogs.com/liaoweipeng/p/5790603.html
https://www.jianshu.com/p/4e1f2d090f20
什么是原型模式
释一
使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象;
原型模式也是一种创建型的设计模式。通过复制自己进行创建。分为深度克隆,和浅克隆;
原型模式指在创建重复对象的同时保持性能;
这种类型的设计模式属于创建模式,因为此模式提供了创建对象的最佳方法之一;
这个模式涉及实现一个原型接口,它只创建当前对象的克隆;
有时直接创建对象时使用这种模式是昂贵的;
例如,在昂贵的数据库操作之后创建对象。因此我们可以缓存对象,在下一个请求时返回其克隆,并在需要时更新数据库,从而减少数据库调用。
释二
原型模式是一种简单、易使用的创建型设计模式,通过给出一个原型对象来指明所创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象。
原型模式要求对象实现一个可以“克隆”自身的接口,这样就可以通过复制一个实例对象本身来创建一个新的实例。
这样一来,通过原型实例创建新的对象,就不再需要关心这个实例本身的类型,只要实现了克隆自身的方法,就可以通过这个方法来获取新的对象,而无须再去通过new来创建。
原型模式与抽象工厂的区别
在建造者模式里,有个指导者,由指导者来管理建造者,用户是与指导者联系的,指导者联系建造者最后得到产品。即建造模式可以强制实行一种分步骤进行的建造过程。
原型模式分三个角色
(1)抽象原型类(prototype):这是一个抽象角色,通常由一个java接口或抽象类实现,具体原型都需要实现该接口。
它是声明克隆方法的接口,是所有具体原型类的公共父类,它可以是接口,抽象类甚至是一个具体的实现类。
(2)具体原型类(concretePrototype):客户端所需要的被复制的对象。
它实现了抽象原型类中声明的克隆方法,在克隆方法中返回一个自己的克隆对象。
(3)客户类(Client):客户类提出创建对象的请求。
在客户类中,使用原型对象只需要通过工厂方式创建或者直接NEW(实例化一个)原型对象,然后通过原型对象的克隆方法就能获得多个相同的对象。
由于客户端是针对抽象原型对象编程的所以还可以可以很方便的换成不同类型的原型对象!
深克隆与浅克隆的区别
简单的说:
如果一个对象中只有基本类型属性,那深克隆和浅克隆效果都是一样的,基本类型数据不管是用深克隆还是浅克隆都会被克隆出一份,但如果对象中包含引用对象属性,那浅克隆其实这是拷贝了一份引用,而深克隆确实把整个引用对象都拷贝了一份。
原型模式与工厂模式的区别
原型模式没有工厂模式的抽象工厂和具体工厂的实现,代码结构要简单一些,当然你也可以把原型模式的抽象原型理解成一种特殊的工厂。
原型模式的优点
(1)根据客户端要求实现动态创建对象,客户端不需要知道对象的创建细节,便于代码的维护和扩展。
(2)使用原型模式创建对象比直接new一个对象在性能上要好的多,因为Object类的clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。
所以在需要重复地创建相似对象时可以考虑使用原型模式。比如需要在一个循环体内创建对象,假如对象创建过程比较复杂或者循环次数很多的话,使用原型模式不但可以简化创建过程,而且可以使系统的整体性能提高很多。
(3) 原型模式类似于工厂模式,但它没有了工厂模式中的抽象工厂和具体工厂的层级关系,代码结构更清晰和简单。
原型模式的注意事项
(1)使用原型模式复制对象不会调用类的构造方法。因为对象的复制是通过调用Object类的clone方法来完成的,它直接在内存中复制数据,因此不 会调用到类的构造方法。不但构造方法中的代码不会执行,甚至连访问权限都对原型模式无效。还记得单例模式吗?单例模式中,只要将构造方法的访问权限设置为 private型,就可以实现单例。但是clone方法直接无视构造方法的权限,所以,单例模式与原型模式是冲突的。
(2)在使用时要注意深拷贝与浅拷贝的问题。clone方法只会拷贝对象中的基本的数据类型,对于数组、容器对象、引用对象等都不会拷贝,这就是浅拷贝。如果要实现深拷贝,必须将原型模式中的数组、容器对象、引用对象等另行拷贝。
网友评论