小小笔记

  DonewsBlog  |  Donews首页  |  Donews社区  |  Donews邮箱  |  我的首页  |  联系作者  |  聚合   |  登录
  129篇文章 :: 0篇收藏:: 123篇评论:: 1个Trackbacks

公告

hoho

文章

收藏

相册

c/c++链接

e书下载

存档


正在读取评论……


总结了网上可以广泛搜到的关于prototype的文章,在可读性上进行了整理!

原文来自:http://www.chinaitpower.com/A/2005-01-06/104135.html

定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.
      Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,
      工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求
      原型对象拷贝它们自己来实施创建。
     
适用性:当要实例化的类是在运行时刻指定时,例如,通过动态装载;或者
 为了避免创建一个与产品类层次平行的工厂类层次时;或者
 当一个类的实例只能有几个不同状态组合中的一种时。
 建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。
 
 用Prototype来创建一批clone产品

import java.io.Serializable;

public interface IPrototypeRam extends Cloneable, Serializable{

       public String getName();

       public void setName(String name);

}

创建产品

import java.io.Serializable;

public class PrototypeRam implements IPrototypeRam{

  private String name;

  public String getName(){
    return this.name;
  }
  public void setName(String name){
    this.name = name;
  }

  public PrototypeRam() {
    this.name = " this is propotype!";
  }

    public Object clone(){//好像感觉没有进行深度clone,而这里的name为reference
    Object o = null;
    try{
     o = super.clone();
    }catch(CloneNotSupportedException  e){
      System.out.println(" PrototypeRam is not cloneable");
    }
    return o;
  }
}

/×××××××××××××××××××××××××××××××××××××××
 ×原型管理器部分
 ×××××××××××××××××××××××××××××××××××××××/
 /**
 * <p>Title: 原型管理器 </p>
 * <p>Description:实现了自动注册原型的功能 </p>
 *                <p>原型管理器运行时只要一个实例,因此可以用singleton模式来实现.</p>
 */

import java.util.HashMap;

public class PrototypeManager {

     private HashMap hm = null;

  private static PrototypeManager prototypeManager = null;

  private  PrototypeManager() {
    hm = new HashMap();
  }

  public static synchronized PrototypeManager getPrototypeManager(){
    if(prototypeManager == null){
      prototypeManager = new PrototypeManager();
    }
    return prototypeManager;
  }
   

  // 注册
  public void register(String name, Object prototype){
    hm.put(name,prototype);
  }

  
   //解除注册
     public void unRegister(String name){
    hm.remove(name);
  }

  // 获得原型实例
     public Object getPrototype(String name){
    Object o = null;
    if(hm.containsKey(name)){
       o = hm.get(name);
    }else{
      try{
      /**
       * 自动查找原型管理器里不存在的类,并动态生成它
       */
      o = Class.forName(name).newInstance();
      this.register(name,o);
      }catch(Exception e){
        System.out.println("class "+name+" don't define "+e.getMessage());
        e.printStackTrace();
      }
    }
    return o;
  }
}


/××××××××××××××××××××××××××××××
 ×客户端实现
 ×××××××××××××××××××××××××××××/

/**
 * <p>Description: 客户端使用prototype模式</p>
 */
public class PrototypeClient {
  PrototypeManager pm = null;
  public PrototypeClient() {
    pm = PrototypeManager.getPrototypeManager();
  }
  public static void main(String args[]){
    PrototypeClient pc = new PrototypeClient();
    String className = null;
    className = "meconsea.PrototypeRam";
    PrototypeRam pr  = null;
    pr = (PrototypeRam)(pc.pm.getPrototype(className));
    if(pr != null){
      PrototypeRam[] pram;
      System.out.println(" for loop before PrototypeRam name == "+pr.getName());
      pram = new PrototypeRam[10];
      for(int i = 0; i < 10; i++){
          /**
         * 生成一批克隆的Ram,并比较他们和原型的不同
         */
        pram[i] = (PrototypeRam)pr.clone();
        System.out.println("loop for PrototypeRam name == "+pram[i].getName());
        pram[i].setName(pram[i].getName()+i);
        System.out.println("clone changes after "+pram[i].getName()+" old "+pr.getName());
      }
    }
  }
}

注:在Java中Prototype模式变成clone()方法的使用。使得使用Prototype模式简单了很多。

Trackback: http://tb.donews.net/TrackBack.aspx?PostId=637257


[点击此处收藏本文]  发表于2005年11月23日 6:35 PM




正在读取评论……

发表评论

大名:
网址:
验证码
评论