|
真爱的事业和真正的爱情一生只有一次,都值得我们温柔地相待,因为那种感觉是永远都无法复制的, 这世界真正属于你的东西其实并不多,你不好好珍惜,它便会离你而去,包括机遇,包括爱情,包括生命。 不要找任何理由, 当幸福在你身边的时候就抓住它,你就一定会很幸福! |
时 间 记 忆 |
« | September 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | | | | |
|
blog名称:玻璃杯中的花生壳 日志总数:162 评论数量:249 留言数量:1 访问次数:828421 建立时间:2004年11月4日 |
 | | |
|
|
设计模式之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();
}
}
登记形式的原始模型模式类图:
| |
|
| | |
|