读书笔记--原型模式

来源:互联网 发布:网络教育哪个好 编辑:程序博客网 时间:2024/06/02 19:55

对于编程来说,简单的复制粘贴极有可能造成重复代码的灾难。


每NEW一次,都需要执行一次构造函数,如果构造函数的执行时间很长,那么多次的执行这个初始化操作就实在是太低效了。一般在初始化的信息不发生变化的情况下,克隆是最好的办法。这既隐藏了对象创建的细节,又对性能是大大的提高。

原型模式等于是不用重新初始化对象,而是动态地获得对象运行时的状态。

浅复制:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。把要复制的对象所引用的对象都复制一遍。

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


原型模式其实就是从一个对象再创建另外一个可定制的对象。而且不需知道任何创建的细节。

abstract class Prototype

{

  private String id;

  public Prototype(String id)

  this.id = id; 

}

public String getId(){

 return id;

}

public abstract Prototype Clone();

}

具体原型类

class ConcretePrototype1 extends Prototype{

  public ConcretePrototype1(String id)

  {

  } 

  //创建当前对象的浅表副本。方法是创建一个新对象,然后将当前对象的非静态字段

复制到该新对象。如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,

则复制引用但不复制引用的对象。因此,原始对象及其副本引用同一对象。

  public Prototype Clone(){

     return (Prototype)this.MemberwiseClone();

  }

}

//客户端代码

public static void Main(String args[]){

 ConcretePrototype1 p1 = new ConcretePrototype1("I");

  ConcretePrototype1 c1 = (ConcretePrototype1)p1.Clone();

System.err.println("==",c1.id);

}

由于克隆实在是太常用了,所以提供了ICloneable接口,其中就是唯一的一个方法Clone(),这样就只需要实现这个接口就可以完成原型模式了。


例子:简历的深层复制

代码结构图:



//工作经历类

class WorkExperience implements ICloneable

{

  private String workDate;

  //省略对应的get和set方法

  private String company;

  //省略对应的get和set方法

  public Object Clone()

  {

    return (Object)this.MemberwiseClone();

   }

}

//简历类

class Resume implements ICloneable

{

  private String name;

  private String sex;

  private String age;

  private WorkExperience work;

  public Resume(String name)

 { 

    this.name = name;

    work = new WorkExperience();

}  

  private Resume(WorkExperience work)

 {

  //提供Clone方法调用的私有构造函数,以便克隆“工作经历”的数据

  this.work = (WorkExperience)work.Clone();

 }

 //设置个人信息

 public void SetPersonalInfo(String sex,String age)

{

  this.sex = sex;

  this.age = age;

}

//设置工作经历

public void SetWorkExperience(String workDate,String company)

{

 work.WorkDate = workDate;

  work.Company = company;

}

//显示

public void Display()

{

System.err.println("name:"+name+";sex:"+sex+";age:"+age);

}

public Object Clone()

{

  //调用私有的构造方法,让“工作经历”克隆完成,然后再给这个“简历”对象的相关字段赋值,最终返回一个深复制的简历对象

   Resume obj = new Resume(this.work);

   obj.name = this.name;

   obj.sex = this.sex;

   obj.age = this.age;

   return obj;

}

}

数据集对象DataSet,它就有Clone()方法和Copy方法,Clone()方法用来复制DataSet的结构,但不复制DataSet的数据,实现了原型模式的浅复制。Copy()方法不但复制结构,也复制数据,其实就是实现了原型模式的深复制。





0 0
原创粉丝点击