原型模式--应用场景:
如果一个对象的创建总是由几种固定组件不同方式组合而成; 如果对象之间仅仅实例属
个对象要来的快一些
与工厂模式的区别:原型模式相当于”改进版的工厂模式”: 对象实现了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 } }