您的位置:首页 > 编程语言 > Java开发

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

2018-02-27 00:35 411 查看
原型模式--应用场景:
如果一个对象的创建总是由几种固定组件不同方式组合而成; 如果对象之间仅仅实例属
性不同。将不同情况的对象缓存起来,直接克隆使用。也许这比采用传递参数重新 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
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: