`
bliuqing
  • 浏览: 65512 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
最近访客 更多访客>>
社区版块
存档分类
最新评论

原型模式(Prototype):

阅读更多
原型模式(Prototype): 用原型实例指定创建对象的种类,并且通过拷贝原型来创建新的实例对象。它允许一个对象再创建另外一个可定制的对象,根本无需知道任何创建细节,工作原理,通过将一个原型对象传给那个要发动创建的对象,这个发动创建对象通过请求原型对象拷贝它们自己来创建。

通俗点,就是通过拷贝来进行创建实例。
import java.util.HashMap;

interface Prototype extends Cloneable {

	public void setName(String name);

}

class ConcretePrototype implements Prototype {
	private String name;

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

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

	public ConcretePrototype() {
		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 ConcretePrototype");
		}
		return o;
	}
}

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;
	}
}

/**
 * * *
 * <p>
 * Title:
 * </p> * *
 * <p>
 * Description: 客户端使用prototype模式
 * </p> * *
 * <p>
 * Copyright: Copyright (c) 2008
 * </p> * *
 * 
 * @author meconsea *
 * @version 1.0
 */
public class PrototypeDemo {
	PrototypeManager pm = null;

	public PrototypeDemo() {
		pm = PrototypeManager.getPrototypeManager();
	}

	public static void main(String args[]) {
		PrototypeDemo pc = new PrototypeDemo();
		String className = null;
		className = "ConcretePrototype";
		ConcretePrototype pr = null;
		pr = (ConcretePrototype) (pc.pm.getPrototype(className));
		if (pr != null) {
			ConcretePrototype[] pram;
			System.out.println("For loop before ConcretePrototype name == "
					+ pr.getName());
			pram = new ConcretePrototype[10];
			for (int i = 0; i < 10; i++) {
				/** * 生成一批克隆的对象,并比较他们和原型的不同 */
				pram[i] = (ConcretePrototype) pr.clone();
				System.out.println("ConcretePrototype name == "
						+ pram[i].getName());
				pram[i].setName(pram[i].getName() + i);
				System.out.println("clone changes after " + pram[i].getName()
						+ " old " + pr.getName());
			}
		}
	}
}

结果:
For loop before ConcretePrototype name ==  this is propotype!
ConcretePrototype name ==  this is propotype!
clone changes after  this is propotype!0 old  this is propotype!
ConcretePrototype name ==  this is propotype!
clone changes after  this is propotype!1 old  this is propotype!
ConcretePrototype name ==  this is propotype!
clone changes after  this is propotype!2 old  this is propotype!
ConcretePrototype name ==  this is propotype!
clone changes after  this is propotype!3 old  this is propotype!
ConcretePrototype name ==  this is propotype!
clone changes after  this is propotype!4 old  this is propotype!
ConcretePrototype name ==  this is propotype!
clone changes after  this is propotype!5 old  this is propotype!
ConcretePrototype name ==  this is propotype!
clone changes after  this is propotype!6 old  this is propotype!
ConcretePrototype name ==  this is propotype!
clone changes after  this is propotype!7 old  this is propotype!
ConcretePrototype name ==  this is propotype!
clone changes after  this is propotype!8 old  this is propotype!
ConcretePrototype name ==  this is propotype!
clone changes after  this is propotype!9 old  this is propotype!
/////
原型模式注意深浅拷贝的问题

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics