Specify the kinds of objects to create using a prototypical instance, and create new objects by copying this prototype.

 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

public Mail clone(){
 Mail mail = null;
 try{
    mail = (Mail) super.clone();
	}
	catche(CloneNotSupportedException e){
	//TODO Auto-generated catch block
	e.printStackTrace();
	}
 }

}

 



 原型模式的杧是一个clone 方法,通过该方法进行对象的拷贝。

 实现方式:通过重写 clone() 方法。

简单的说就是: 实现一个接口( IColoneable),重写 Clone() 方法

原型模式的优点:
1.性能优良
  原型模式在内存中存放的是二进制流的拷贝,要比直接new 一个对象性能好很多,特辑是要在一个循环体内产生大量的对象时,原型模式可以更好地体现其优点。

2.逃避构造函数的约束
   这既是它的优点也是缺点,直接在内中中拷贝,构造函数是不会执行的,优点是减少也约束,缺点也是减少约束。

原型模式的使用场景
 1.资源优化场景
    类初始化需要消耗非常多的资源,这个资源包括数据、硬件资源等。
 2. 性能和安全性要求的场景
     通过new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。
 3. 一个对象多个 修改者的场景
    一个对象需要提供给其他对象访问,而且各个调用者可能都需要个性其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。

 在实际项目中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过 clone()的方法创建一个对象,然后由工厂方法提供给调用者。
   
 原型模式注意事项:

  1.Clone 一个对象时,构造函数是不会执行的。
  2. 浅拷贝和深拷贝

   浅拷贝:Object 类提供的方法 clone 只是拷贝本对象,其对象内部的数组,引用对象等都不拷贝。

   深拷贝:对私有类的变量进行独立的拷贝。

 深拷贝和浅拷贝不要混合使用,特别是在涉及类的继承时,父类有多个引用的情况就非常复杂,方案是深拷贝和浅拷贝分开实现。

要使用 clone 方法,在类的成员变量上不要增加 final 关键字。

最佳实践:
  原型棧无产生出一个包含大量共有信息的类,然后可以拷贝出副本,修正细节信息,建立了一个完整的个性对象。也就是说一个对象的产生不由零起步,直接从一个已经具备一定雏形的对象克隆,然后修改为生产需要的对象。

posted on 2015-01-29 16:55  wisdo  阅读(221)  评论(0编辑  收藏  举报