1、 实现需求
生成一个类对象,不是直接new 类(。。。)出来的,而是用某个类对象拷贝出来的,这种设计方式就是原型设计模式
2、 编程要点
1) 写一个类
2) clone出来类对象
有一个问题,与原有类属性,不完全分离
3) 使用时
采一个类对象,clone出一新的对象
3、 问题分析
1) 简单拷贝出来的新类对象,新对象类属性与原类对象类性是同一个变量,这样的复制对象无意义
2) 复制出的新对象,要与原有类属性分离,这样新的类对象才有意义
4、 示例
public class MyType_1 implements Cloneable{ String name; List list; public MyType_1() { Log.getLog().info("this="+this);
}
//下面是简单地拷贝出一个新的类对象 @Override protected MyType_1 clone() throws CloneNotSupportedException { // TODO Auto-generated method stub MyType_1 obj=(MyType_1) super.clone(); return obj; } } |
public class MyType_2 implements Cloneable{ String name; List list; public MyType_2() { Log.getLog().info("this="+this);
}
@Override protected MyType_2 clone() throws CloneNotSupportedException { // TODO Auto-generated method stub MyType_2 obj=(MyType_2) super.clone(); //将拷贝出来的新对象的类属性,与原有类对象的类属性分离 obj.name=new String(); obj.list=new ArrayList(); return obj; }
} |
public class TestPrototype {
/** * @param args */ public static void main2(String[] args)throws Exception { //检测原型设计模式 MyType_1 obj1=new MyType_1(); Log.getLog().info("obj1="+obj1); obj1.name="李晓华"; List<String> list=new ArrayList(); list.add("北京"); list.add("上海"); list.add("天津"); obj1.list=list; MyType_1 obj2=obj1.clone(); Log.getLog().info("obj2="+obj2); boolean check=obj1==obj2; Log.getLog().info("check="+check); String name2=obj2.name; Log.getLog().info("name2="+name2); List<String>list2=obj2.list; boolean check2=list2==list;
Log.getLog().info("list2="+list2); Log.getLog().info("list check2="+check2);
} public static void main(String[] args)throws Exception { //检测原型设计模式 MyType_2 obj1=new MyType_2(); Log.getLog().info("obj1="+obj1); obj1.name="李晓华"; List<String> list=new ArrayList(); list.add("北京"); list.add("上海"); list.add("天津"); obj1.list=list; MyType_2 obj2=obj1.clone(); Log.getLog().info("obj2="+obj2); boolean check=obj1==obj2; Log.getLog().info("check="+check); String name2=obj2.name; Log.getLog().info("name2="+name2); List<String>list2=obj2.list; boolean check2=list2==list;
Log.getLog().info("list2="+list2); Log.getLog().info("list check2="+check2);
}
} |