java 设计模式4--原型模式

原型模式--应用场景:

如果一个对象的创建总是由几种固定组件不同方式组合而成; 如果对象之间仅仅实例属

性不同。将不同情况的对象缓存起来,直接克隆使用。也许这比采用传递参数重新 new 一

个对象要来的快一些

与工厂模式的区别:原型模式相当于”改进版的工厂模式”: 对象实现了Clonnable()接口,

加入了 java 反射机制,去掉了工厂模式繁多的子类

【new 和clone 区别:clone能够动态的抽取当前对象运行时的状态并且克隆到新的对象中,新

对象就可以在此基础上进行操作而不损坏原有对象;而 new 只能得到一个刚初始化的对象, 数据量不够】

原型模式弊端:   每个目标类型都必须含有 clone 方法,而在已有类的基础上来添加 clone 操作

是比较困难的;而且当内部包括一些不支持 copy 或者循环引用的对象时,实现就更加困难了

在eclipse上开发:

一级目录:

//所有目标类的: 父类
public class FatherPrototype  implements Cloneable{
	//定义测试用的属性
	private String name;
	
	//定义:被克隆的方法,自己实现了,让所有子类继承得到
	public FatherPrototype  clone(){
		try {
			return (FatherPrototype) super.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	//set,get
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}
//原型管理器: 管理所有目标类的对象,负责克隆所管理的对象
//实现方式: 单例类{HashMap容器+简单工厂方法}
public class Prototype_manager {
	//属性:Map容器
	private static Map<String,FatherPrototype> map;
//=======实现单例--此类只能存在一个对象:私有构造器========
	private Prototype_manager(){ 
		map=new HashMap<String,FatherPrototype>();//创建容器
	}
	
	public static Prototype_manager getInstance(){
		return Inner.getOuterInstance();
	}
	
	//静态内部类:实现单例
	private static class Inner{
		private static Prototype_manager pro=
				                     new Prototype_manager();
		public static Prototype_manager getOuterInstance(){
			return pro;
		}
	}
	
//========管理对象的克隆任务:  管理map容器里的对象======
	//容器:添加操作
	public  void  add(String name , FatherPrototype obj){
		map.put(name, obj);
	}
	//容器:删除操作
		public  void  remove(String name ){
			map.remove(name);
		}
	public static FatherPrototype getClonedPrototype(String name){//输入要得到的类型
		//判断输入的类型: 是否已存在
		if(map.containsKey(name)){//存在--克隆之并返回
			return map.get(name).clone();
		}
		else{//不存在此类型的对象:new 一个对象, 加入到容器,并返回
			FatherPrototype pro=null;
			try{
				pro=(FatherPrototype)
						   Class.forName(name).newInstance();
				Prototype_manager.getInstance().add(name, pro);
			}
			catch (Exception e){
				System.out.println("此类型,未定义.......");
			}
		return pro;//初次创建的对象:无需克隆,因为它就是独立存在的
		}//else
	}
}

二级目录:目标类--各种子类

public class Son_Type1 extends FatherPrototype{ }

public class Son_Type2 extends FatherPrototype{  }

测试:看调度者是否运行良好--是否成功克隆一个对象

public class TestPrototype {
	/**创建子类:获取对象,看是否是被克隆的==改变原来的,
	新的是否改变*/
	public static void main(String[] args) {
		FatherPrototype pro=Prototype_manager.getInstance().
				getClonedPrototype("原型模式.Son_Type1");//包名.类名
		pro.setName("lisi");
		FatherPrototype pro2=Prototype_manager.getInstance().
				getClonedPrototype("原型模式.Son_Type1");//包名.类名

		FatherPrototype pro3=Prototype_manager.getInstance(). 
				getClonedPrototype("原型模式.Son_Type2");//包名.类名
		pro3.setName("zhangsan");
		FatherPrototype pro4=Prototype_manager.getInstance().
				getClonedPrototype("原型模式.Son_Type2");//包名.类名

		//查看是否为新的对象--
		System.out.println(pro.getName()+"=="+pro2.getName());//lisi==lisi
		System.out.println(pro3.getName()+"=="+pro4.getName());//zhangsan==zhangsan
	}
}

猜你喜欢

转载自blog.csdn.net/eyeofeagle/article/details/79383203