java设计模式实战--原型管理器及其应用

  原型管理器是对原型的管理类,可以添加原型对象,也可以获得原型对象。

下面开始实战,便于理解原型管理器中的克隆模式(本次讲的是浅克隆)。

比如每个学校招生,学校为每个学生建立信息档案,每个学生为一个对象。这些信息档案部分信息是相同的,这时就可以将这些相同的信息通过一个对象克隆到其他对象,

剩下的不同信息再通过单独输入。这样便节省很大的精力与时间。具体代码如下:

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 }

 

posted @ 2018-03-19 17:58  TinyMark  阅读(995)  评论(0编辑  收藏  举报