首页(162) xml(5) spring(1) 生活(8) java(70) 代码(10) 英语(4) 数据库(7) c#(14) 成长(10) 软件工程(27)  写新日志
 
 

玻璃杯中的花生壳

  真爱的事业和真正的爱情一生只有一次,都值得我们温柔地相待,因为那种感觉是永远都无法复制的, 这世界真正属于你的东西其实并不多,你不好好珍惜,它便会离你而去,包括机遇,包括爱情,包括生命。
   不要找任何理由,  当幸福在你身边的时候就抓住它,你就一定会很幸福! 
   

时 间 记 忆
«September 2025»
123456
78910111213
14151617181920
21222324252627
282930

最 新 评 论
回复:xml的Jdom解析过程详解
回复:突然想到的几句话!
 Boyle came out of n
回复:xml的Jdom解析过程详解
回复:配置Spring数据源
回复:使用SAX解析XML
回复:java中写文件操作时FileOu
回复:关联和依赖关系的区分
回复:HttpSessionListen
回复:Spring AOP四种创建通知(

最 新 日 志
Java开发者的十大戒律
配置Spring数据源
java多线程设计模式
java中switch的使用
性格,编码,测试
突然想到的几句话!
理解Spring AOP中的关键概念
Spring AOP四种创建通知(拦截器
xml的四种解析方法 比较 sax,do
xml的Jdom解析过程详解

最 新 留 言
签写新留言

我渴望知识
很好的东东
帖子不错,道声谢
想拜师学艺
我的呼喊

搜 索


用 户 登 录
用户名称:
登陆密码:
密码保存:

友 情 连 接

模板设计:部落窝模板世界

blog名称:玻璃杯中的花生壳
日志总数:162
评论数量:249
留言数量:1
访问次数:828421
建立时间:2004年11月4日
 
 
 
[软件工程]设计模式之Prototype(原型)
[ 2007/3/26 10:00:30 | By: 玻璃杯中的花生壳 ]
 
设计模式之Prototype(原型) Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。如何使用?因为Java中的提供clone()方法来实现对象的克隆(具体了解clone()按这里),所以Prototype模式实现一下子变得很简单.以勺子为例:public abstract class AbstractSpoon implements Cloneable{   String spoonName;   public void setSpoonName(String spoonName) {this.spoonName = spoonName;}  public String getSpoonName() {return this.spoonName;}  public Object clone()   {    Object object = null;    try {      object = super.clone();    } catch (CloneNotSupportedException exception) {      System.err.println("AbstractSpoon is not Cloneable");    }    return object;  }} 有两个具体实现(ConcretePrototype):public class SoupSpoon extends AbstractSpoon{   public SoupSpoon()  {    setSpoonName("Soup Spoon");   }}public class SaladSpoon extends AbstractSpoon{   public SaladSpoon()  {    setSpoonName("Salad Spoon");   }}调用Prototype模式很简单:AbstractSpoon spoon = new SoupSpoon();AbstractSpoon spoon = new SaladSpoon(); 当然也可以结合工厂模式来创建AbstractSpoon实例。在Java中Prototype模式变成clone()方法的使用,由于Java的纯洁的面向对象特性,使得在Java中使用设计模式变得很自然,两者已经几乎是浑然一体了。这反映在很多模式上,如Interator遍历模式。           java设计模式---prototype(原型)模式 java设计模式---prototype(原型)模式 定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.      Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,      工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求      原型对象拷贝它们自己来实施创建。      适用性:当要实例化的类是在运行时刻指定时,例如,通过动态装载;或者  为了避免创建一个与产品类层次平行的工厂类层次时;或者  当一个类的实例只能有几个不同状态组合中的一种时。 建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。 代码可以说明一切的:代码部分/************************* * 定义interface *************************/ package meconsea; /** * * <p>Title:design in java </p> * * <p>Description: 用Prototype来创建一批clone产品</p> *                 <p>有关clone的知识请参考另一个blog</p> * * <p>Copyright: Copyright (c) 2005</p> * * <p>Company: www.hhzskj.com</p> * * @author meconsea * @version 1.0 */ import java.io.Serializable; public interface IPrototypeRam extends Cloneable, Serializable{     /**     * 用于bean     * @return String     */    public String getName();     /**     * 用于bean     * @param name String     */     public void setName(String name); } /××××××××××××××××××××××××××××××××××× × 接口的实现 ×××××××××××××××××××××××××××××××××××/ package meconsea; /** * * <p>Title:design in java </p> * * <p>Description: 用Prototype来创建一批clone产品</p> *                 <p>有关clone的知识请参考另一个blog</p> * * <p>Copyright: Copyright (c) 2005</p> * * <p>Company: www.hhzskj.com</p> * * @author meconsea * @version 1.0 */ 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!";  }   /**   * 覆写clone方法   * @return Object   */  public Object clone(){    Object o = null;    try{     o = super.clone();    }catch(CloneNotSupportedException  e){      System.out.println(" PrototypeRam is not cloneable");    }    return o;  }} /××××××××××××××××××××××××××××××××××××××× ×原型管理器部分 ×××××××××××××××××××××××××××××××××××××××/ package meconsea; /** * * <p>Title: 原型管理器 </p> * * <p>Description:实现了自动注册原型的功能 </p> *                <p>原型管理器运行时只要一个实例,因此可以用singleton模式来实现.</p> *                <p>有关singleton的参照其他blog.</p> * <p>Copyright: Copyright (c) 2005</p> * * <p>Company:www.hhzskj.com </p> * * @author meconsea * @version 1.0 */import java.util.HashMap; public class PrototypeManager {     /**     * 关于HashMap和HashTable的区别参考其他blog     */    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;  }   /**   * 注册   * @param name String   * @param prototype Object   */  public void register(String name, Object prototype){    hm.put(name,prototype);  }   /**   * 解除注册   * @param name String   */  public void unRegister(String name){    hm.remove(name);  }   /**   * 获得原型实例   * @param name String   * @return Object   */  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;  }} /×××××××××××××××××××××××××××××× ×客户端实现 ×××××××××××××××××××××××××××××/ package meconsea; /** * * <p>Title: </p> * * <p>Description: 客户端使用prototype模式</p> * * <p>Copyright: Copyright (c) 2005</p> * * <p>Company: www.hhzskj.com</p> * * @author meconsea * @version 1.0 */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 Pattern)     原始模型模式属于对象的创建模式,通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象。     原始模型模式有两种形式:简单形式和登记形式。     简单形式的原始模型类图:     源代码: public interface Prototype extends Cloneable {     Object clone(); }   public class ConcretePrototype implements Prototype {     public Object clone()     {           System.out.println("return new ConcretePrototype()");         return new ConcretePrototype();     } }   public class Client {        public static void main(String[] args) {               Prototype thePrototype = new ConcretePrototype();               Prototype pt1 = (Prototype)thePrototype.clone();        } } 登记形式的原始模型模式类图:

 

阅读全文(2154) | 回复(0) | 编辑 | 精华
 

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)
 
部落窝Blog模板世界部落窝Blog模板世界
站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.046 second(s), page refreshed 144785383 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号