设计模式之原型模式

  原型模式应用的条件为:创建给定类的实例过程比较复杂,或比较耗时耗资源。因而原型模型主要的目的是为了提高创建对象的效率,隐藏了复杂的创建过程。原型模式还涉及到一个浅复制和深复制的问题,这问题在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方法实例一个新的对象,此过程中隐藏了对象初始化的细节,当实例化一个对象过于复杂的时候,这种方式就会变得很高效(并不是说所有的情况下,使用原型模式都会提高效率,节省资源开支,但是多数情况下的确如此)。

 

 

posted @ 2012-08-26 23:58  iPolaris  阅读(184)  评论(0编辑  收藏  举报