原型模式应用的条件为:创建给定类的实例过程比较复杂,或比较耗时耗资源。因而原型模型主要的目的是为了提高创建对象的效率,隐藏了复杂的创建过程。原型模式还涉及到一个浅复制和深复制的问题,这问题在objective-c更常被提到,java中的说法应该是引用。浅复制只获取了复制对象的指针,与复制对象共享资源,深复制则是获取一个真正地副本对象,享有自己独立的资源。下面是一个小例子,例子中的情况并非需要原型设计模式,只是为了说明一下原型模式的用法。
首先创建了一个Person类,需要实现Cloneable接口复写clone()方法
package com.cnblogs.ipolaris.test; public class Person implements Cloneable{private String name;private String sex;private int age;public Person(String name,String sex,int age){this.name = name;this.sex = sex;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic Object clone() throws CloneNotSupportedException {return super.clone();}}
package com.cnblogs.ipolaris.test; public class PrototypeTest { /*** @param args*/public static void main(String[] args) {Person p1 = new Person("悟空","男",500);Person p2 = p1;try {Person p3 = (Person) p1.clone();System.out.println("p1.name->"+p1.getName()+"\np2.name->"+p2.getName()+"\np3.name->"+p3.getName());p1.setName("八戒");System.out.println("****************************************************");System.out.println("p1.name->"+p1.getName()+"\np2.name->"+p2.getName()+"\np3.name->"+p3.getName());p2.setName("师傅");System.out.println("****************************************************");System.out.println("p1.name->"+p1.getName()+"\np2.name->"+p2.getName()+"\np3.name->"+p3.getName());} catch (CloneNotSupportedException e) {// TODO Auto-generated catch blocke.printStackTrace();} }}
p2为浅复制,p3为深复制(原型获取),最终的输出结果为
可以看出,浅引用其实是一个对象,使用clone方法获取的为一个新的对象,即通过clone方法实例一个新的对象,此过程中隐藏了对象初始化的细节,当实例化一个对象过于复杂的时候,这种方式就会变得很高效(并不是说所有的情况下,使用原型模式都会提高效率,节省资源开支,但是多数情况下的确如此)。