一、是什么?
定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。(官方定义)
原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具备以下两个条件:
1.实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。
2.重写Object类中的clone方法。Java中所有类的父类都是Object类,Object类中有一个clone方法,作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,因此,Prototype类需要将clone方法的作用域修改为public类型。
原型模式是一种比较简单的模式,也非常容易理解,实现一个接口,重写一个方法即完成了原型模式。在实际应用中,原型模式很少单独出现。经常与其他模式混用,它的原型类Prototype也常用抽象类来替代。
类型:创建型模式
二、何时用?
有的时候,创建一个对象可能会非常耗时,比如对象需要从远程数据库中获取数据来填充又或者创建对象需要读取硬盘文件。
此时,如果已经有了一个对象,再创建对象时,不需要提供专门的new()操作,而是采用复制现有对象的方法,就可以快速完成对象的创建,这无疑是一种非常有效的方式。
三、怎么用?
classPrototype implements Cloneable { public Prototype clone(){ Prototype prototype = null; try{ prototype =(Prototype)super.clone(); }catch(CloneNotSupportedException e){ e.printStackTrace(); } return prototype; } } class ConcretePrototype1 extends Prototype{ public void show(){ System.out.println("原型模式实现类1"); } } class ConcretePrototype2 extends Prototype{ public void show(){ System.out.println("原型模式实现类2"); } } publicclass Client { public static void main(String[] args){ ConcretePrototype cp = newConcretePrototype(); for(int i=0; i< 10; i++){ ConcretePrototype clonecp =(ConcretePrototype)cp.clone(); clonecp.show(); } } }<span style="font-family: SimSun; font-size: 14pt; background-color: rgb(255, 255, 255);"> </span>
四、优缺点:
优点:
1.可以快速创建很多相同或相似的对象,简化对象的创建过程(因为Object类的clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。)
2.保存对象的中间状态
3.扩展性好:动态增加减少产品类。
4.简化了创建结构
缺点:每一个类必须配备一个克隆方法,因此对已有类进行改造比较麻烦,需要修改其源代码,并且在实现深克隆是需要编写较为复杂的代码。
五、总结
以上就是对原型模式基础知识的一个讲解,只有对这些基础知识有了了解才会将它进一步优化,让它发挥更大的价值。那么下一篇就会更深一步的介绍原型模式之浅拷贝和深拷贝。