设计模式之原型模式

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值