原型管理器是对原型的管理类,可以添加原型对象,也可以获得原型对象。
下面开始实战,便于理解原型管理器中的克隆模式(本次讲的是浅克隆)。
比如每个学校招生,学校为每个学生建立信息档案,每个学生为一个对象。这些信息档案部分信息是相同的,这时就可以将这些相同的信息通过一个对象克隆到其他对象,
剩下的不同信息再通过单独输入。这样便节省很大的精力与时间。具体代码如下:
1.prototypeManger原型类
package com.Mark.chapter05.originalClass.applicationTemplate;
import java.util.Hashtable;
public class prototypeManger
{
//定义一个哈希表,存储原型对象
private Hashtable ht=new Hashtable();
private static prototypeManger pm=new prototypeManger();
// 往哈希表里存值
public void addPrototype(String key,Object obj)
{
ht.put(key,obj);
}
// 取值
public Object getPrototype(String key)
{
return ht.get(key);
}
// 新建prototypeManger对象 饿汉 单例模式
public static prototypeManger getProtoType()
{
return pm;
}
}
2Student.类 与 pubInfo 公共信息类
1 package com.Mark.chapter05.originalClass.applicationTemplate;
2
3 public class Student implements Cloneable
4 {
5 String name;
6 int age;
7 PubInfo info;//公共信息,一般公共信息是克隆的
8
9 public PubInfo getInfo()
10 {
11 return info;
12 }
13 public void setInfo(PubInfo info)
14 {
15 this.info = info;
16 }
17
18 public String getName()
19 {
20 return name;
21 }
22 public int getAge()
23 {
24 return age;
25 }
26 public void setName(String name)
27 {
28 this.name = name;
29 }
30 public void setAge(int age)
31 {
32 this.age = age;
33 }
34 @Override
35 protected Object clone() throws CloneNotSupportedException
36 {
37 return super.clone();
38 }
39 }
40
41
42 class PubInfo
43 {
44 String college;
45 String city;
46 String zip;
47 public PubInfo(String college,String city,String zip)
48 {
49 this.college=college;
50 this.city=city;
51 this.zip=zip;
52 }
53 public String getCollege()
54 {
55 return college;
56 }
57 public void setCollege(String college)
58 {
59 this.college = college;
60 }
61 public String getCity()
62 {
63 return city;
64 }
65 public String getZip()
66 {
67 return zip;
68 }
69 public void setZip(String zip)
70 {
71 this.zip = zip;
72 }
73 public void setCity(String city)
74 {
75 this.city = city;
76 }
77
78 @Override
79 protected Object clone() throws CloneNotSupportedException
80 {
81 return super.clone();
82 }
83 }
3.Test测试类
1 package com.Mark.chapter05.originalClass.applicationTemplate;
2
3
4 import java.util.Scanner;
5 import java.util.Vector;
6
7 public class Test
8 {
9 public static void main(String[] args) throws CloneNotSupportedException
10 {
11 int m=10,n=10;
12 prototypeManger pm=new prototypeManger();
13 PubInfo p=new PubInfo("金科","南京","223800");
14 Student s=new Student(); //创建金科学生原型对象
15 s.setInfo(p);
16 pm.addPrototype("金科",s);//加入原型管理器
17 PubInfo p2=new PubInfo("晓庄","南京","123456");
18 Student s2= new Student();
19 s2.setInfo(p2);
20 pm.addPrototype("晓庄",s2);//加入原型管理器
21
22 Scanner sc=new Scanner(System.in);
23 Vector<Student> vec=new Vector<>();//创建金科学生集合
24 Student t=(Student)pm.getPrototype("金科");//获取原型对象
25 for (int i=0;i<m;i++)
26 {
27 Student st=(Student)t.clone();//浅复制创建学生对象
28 st.setName(sc.nextLine());//输入姓名
29 st.setAge(sc.nextInt());//输入年龄
30 vec.add(st);
31 // 至此,相同的公共信息自动完成(通过克隆),不同的就通过挨个输入
32 // 使用原型管理器就是为了生产更多的原型类。
33 }
34 // 下面一个晓庄学生与上相同,就不用写了。
35 }
36 }