设计模式之原型模式
原型模式应用的条件为:创建给定类的实例过程比较复杂,或比较耗时耗资源。因而原型模型主要的目的是为了提高创建对象的效率,隐藏了复杂的创建过程。原型模式还涉及到一个浅复制和深复制的问题,这问题在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; } @Override public 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 block e.printStackTrace(); } } }
p2为浅复制,p3为深复制(原型获取),最终的输出结果为
可以看出,浅引用其实是一个对象,使用clone方法获取的为一个新的对象,即通过clone方法实例一个新的对象,此过程中隐藏了对象初始化的细节,当实例化一个对象过于复杂的时候,这种方式就会变得很高效(并不是说所有的情况下,使用原型模式都会提高效率,节省资源开支,但是多数情况下的确如此)。