Jerome Kwok〖旧日的足迹〗

仁者不忧,知者不惑,勇者不惧
posts - 0, comments - 0, trackbacks - 0, articles - 81
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

模式之---原型模式(Prototype Pattern)

Posted on 2009-06-30 11:59 Jerome Kwok 阅读(103) 评论(0)  编辑  收藏 所属分类: 设计模式

定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,

工作原理:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。
     
适用性:当要实例化的类是在运行时刻指定时,例如,通过动态装载;

             或者为了避免创建一个与产品类层次平行的工厂类层次时;

             或者当一个类的实例只能有几个不同状态组合中的一种时。
             建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。

 

        因为我们编程要面向接口编程,所以这里我们为原型模式的具体实现类抽取出一个接口。

1、采用序列化的方式实现

Java代码
  1 /**  
  2 
 *   
  3 
 * @功能 :工作经历  
  4 
 * @创建人 gao_jie  
  5 
 * @创建日期 May 11, 2009  
  6 
 * @版本 1.0  
  7 
 *   
  8  */
  
  9 public class WorkExperience  implements
 Serializable{   
 10 
  
 11     private String workdate;// 工作时间   

 12     private String workcompany;// 工作的公司   
 13     /**  
 14      * @return
  
 15      */
  
 16     public
 String getWorkdate() {   
 17         return
 workdate;   
 18 
    }   
 19 
  
 20     /**
  
 21      * @param
 workdate  
 22      */
  
 23     public void
 setWorkdate(String workdate) {   
 24         this.workdate =
 workdate;   
 25 
    }   
 26 
  
 27     /**
  
 28      * @return
  
 29      */
  
 30     public
 String getWorkcompany() {   
 31         return
 workcompany;   
 32 
    }   
 33 
  
 34     /**
  
 35      * @param
 workcompany  
 36      */
  
 37     public void
 setWorkcompany(String workcompany) {   
 38         this.workcompany =
 workcompany;   
 39 
    }   
 40 
}   
 41 
  
 42 /**
  
 43 
 *   
 44 
 * @功能 原型模式抽象接口      
 45 
 * @创建人   gao_jie  
 46 
 * @创建日期 Jun 27, 2009  
 47 
 * @版本     1.0  
 48 
 *   
 49  */
  
 50 public interface Iprototype extends
 Cloneable, Serializable{   
 51 
  
 52     /**
  
 53 
     * 设置用户个人信息  
 54 
     *   
 55      * @param
 name  
 56      * @param
 sex  
 57      */
  
 58     public abstract void
 setPersonInfo(String sex, String age);   
 59 
  
 60     /**
  
 61 
     * 设置工作经历  
 62 
     *   
 63      * @param
 name  
 64      * @param
 sex  
 65      */
  
 66     public abstract void
 setWorkExperience(String workdate, String company);   
 67 
  
 68     /**
  
 69 
     * 显示结果  
 70      */
  
 71     public abstract void
 display();   
 72 
       
 73     /**
  
 74      * @return
  
 75      */
  
 76     public
 Object clone();   
 77 
}   
 78 /**
  
 79 
 *   
 80 
 * @功能 原型模式具体实现  
 81 
 * @创建人 gao_jie  
 82 
 * @创建日期 May 11, 2009  
 83 
 * @版本 1.0  
 84 
 *   
 85  */
  
 86 public class ConcretePrototype implements
 Iprototype {   
 87 
  
 88     private String name;// 姓名   

 89     private String sex;// 性别   
 90     private String age;// 年龄   
 91     private WorkExperience Work;// 工作经历   
 92   
 93     /**
  
 94 
     * 构造函数  
 95 
     *   
 96      * @param
 name  
 97      */
  
 98     public
 ConcretePrototype(String name) {   
 99         this.name =
 name;   
100         this.Work = new
 WorkExperience();   
101 
    }   
102 
  
103     /*
 (non-Javadoc)  
104 
     * @see eight.prototypedeepcopy2.Prototype#setPersonInfo(java.lang.String, java.lang.String)  
105      */
  
106     public void
 setPersonInfo(String sex, String age) {   
107         this.sex =
 sex;   
108         this.age =
 age;   
109 
    }   
110 
  
111     /*
 (non-Javadoc)  
112 
     * @see eight.prototypedeepcopy2.Prototype#setWorkExperience(java.lang.String, java.lang.String)  
113      */
  
114     public void
 setWorkExperience(String workdate, String company) {   
115         this
.Work.setWorkdate(workdate);   
116         this
.Work.setWorkcompany(company);   
117 
    }   
118 
  
119     /*
 (non-Javadoc)  
120 
     * @see eight.prototypedeepcopy2.Prototype#display()  
121      */
  
122     public void
 display() {   
123         System.out.println("名字:" +
 name);   
124         System.out.println("性别:" +
 sex);   
125         System.out.println("年龄:" +
 age);   
126 
        System.out   
127                 .println("工作经历:" + Work.getWorkdate() +
 Work.getWorkcompany());   
128 
    }   
129 
  
130     /*
  
131 
     * (non-Javadoc)  
132 
     *   
133 
     * @see java.lang.Object#clone()  
134      */
  
135     public
 Object clone() {   
136         try
 {   
137             ByteArrayOutputStream bos = new
 ByteArrayOutputStream();   
138             ObjectOutputStream oos = new
 ObjectOutputStream(bos);   
139             oos.writeObject(this
);   
140             // 将流序列化   

141             ByteArrayInputStream bis = new ByteArrayInputStream(bos   
142 
                    .toByteArray());   
143             ObjectInputStream ois = new
 ObjectInputStream(bis);   
144             return
 ois.readObject();   
145         } catch
 (IOException e) {   
146 
            e.printStackTrace();   
147         } catch
 (ClassNotFoundException e) {   
148 
            e.printStackTrace();   
149 
        }   
150         return null
;   
151 
    }   
152 
}   
153 /**
  
154 
 *   
155 
 * @功能;客户端测试类  
156 
 * @创建人 gao_jie  
157 
 * @创建日期 May 11, 2009  
158 
 * @版本 1.0  
159 
 *   
160  */
  
161 public class
 Client {   
162 
  
163     /**
  
164      * @param
 args  
165      */
  
166     public static void
 main(String[] args) {   
167         Iprototype a = new ConcretePrototype("大鸟"
);   
168         a.setPersonInfo("""29"
);   
169         a.setWorkExperience("2009-12-19""中创软件"
);   
170         Iprototype b =
 (ConcretePrototype)a.clone();   
171         b.setPersonInfo("""25"
);   
172         b.setWorkExperience("2008-12-13""中间件"
);   
173 
  
174 
        a.display();   
175 
        b.display();   
176 
    }   
177 
}   
178 
客户端显示结果:   
179 
名字:大鸟   
180 
性别:男   
181 年龄:29
  
182 工作经历:2009-12-
19中创软件   
183 
名字:大鸟   
184 
性别:女   
185 年龄:25
  
186 工作经历:2008-12-
13中间件  
187 

2、采用深度复制方式实现
Java代码
  1 **   
  2  *
    
  3  *
 @功能 :工作经历   
  4  *
 @创建人 gao_jie   
  5  * @创建日期 May 112009
  
  6  * @版本 1.0
  
  7  *
    
  8  */
   
  9 public class WorkExperience  implements
 Cloneable{   
 10 
  
 11     private String workdate;// 工作时间   

 12     private String workcompany;// 工作的公司   
 13     /**  
 14      * @return
  
 15      */
  
 16     public
 String getWorkdate() {   
 17         return
 workdate;   
 18 
    }   
 19 
  
 20     /**
  
 21      * @param
 workdate  
 22      */
  
 23     public void
 setWorkdate(String workdate) {   
 24         this.workdate =
 workdate;   
 25 
    }   
 26 
  
 27     /**
  
 28      * @return
  
 29      */
  
 30     public
 String getWorkcompany() {   
 31         return
 workcompany;   
 32 
    }   
 33 
  
 34     /**
  
 35      * @param
 workcompany  
 36      */
  
 37     public void
 setWorkcompany(String workcompany) {   
 38         this.workcompany =
 workcompany;   
 39 
    }   
 40     public Object clone() throws
 CloneNotSupportedException {   
 41         return super
.clone();   
 42 
    }   
 43 
}   
 44 /**
  
 45 
 *   
 46 
 * @功能 原型模式抽象接口  
 47 
 * @创建人 gao_jie  
 48 
 * @创建日期 Jun 27, 2009  
 49 
 * @版本 1.0  
 50 
 *   
 51  */
  
 52 public interface Iprototype extends
 Cloneable, Serializable {   
 53 
  
 54     /**
  
 55 
     * 设置用户个人信息  
 56 
     *   
 57      * @param
 name  
 58      * @param
 sex  
 59      */
  
 60     public abstract void
 setPersonInfo(String sex, String age);   
 61 
  
 62     /**
  
 63 
     * 设置工作经历  
 64 
     *   
 65      * @param
 name  
 66      * @param
 sex  
 67      */
  
 68     public abstract void
 setWorkExperience(String workdate, String company);   
 69 
  
 70     /**
  
 71 
     * 显示结果  
 72      */
  
 73     public abstract void
 display();   
 74 
  
 75     /**
  
 76      * @return
  
 77      */
  
 78     public Object clone() throws
 CloneNotSupportedException;   
 79 
}   
 80 
  
 81 /**
  
 82 
 *   
 83 
 * @功能 原型模式具体实现  
 84 
 * @创建人 gao_jie  
 85 
 * @创建日期 May 11, 2009  
 86 
 * @版本 1.0  
 87 
 *   
 88  */
  
 89 public class ConcretePrototype implements
 Iprototype {   
 90 
  
 91     private String name;// 姓名   

 92     private String sex;// 性别   
 93     private String age;// 年龄   
 94     private WorkExperience Work;// 工作经历   
 95   
 96     /**
  
 97 
     * 构造函数  
 98 
     *   
 99      * @param
 name  
100      */
  
101     public
 ConcretePrototype(String name) {   
102         this.name =
 name;   
103         this.Work = new
 WorkExperience();   
104 
    }   
105 
  
106     /*
  
107 
     * (non-Javadoc)  
108 
     *   
109 
     * @see eight.prototypedeepcopy2.Prototype#setPersonInfo(java.lang.String,  
110 
     *      java.lang.String)  
111      */
  
112     public void
 setPersonInfo(String sex, String age) {   
113         this.sex =
 sex;   
114         this.age =
 age;   
115 
    }   
116 
  
117     /*
  
118 
     * (non-Javadoc)  
119 
     *   
120 
     * @see eight.prototypedeepcopy2.Prototype#setWorkExperience(java.lang.String,  
121 
     *      java.lang.String)  
122      */
  
123     public void
 setWorkExperience(String workdate, String company) {   
124         this
.Work.setWorkdate(workdate);   
125         this
.Work.setWorkcompany(company);   
126 
    }   
127 
  
128     /**
  
129      * @return
  
130      */
  
131     public
 WorkExperience getWork() {   
132         return
 Work;   
133 
    }   
134 
  
135     /*
  
136 
     * (non-Javadoc)  
137 
     *   
138 
     * @see eight.prototypedeepcopy2.Prototype#display()  
139      */
  
140     public void
 display() {   
141         System.out.println("名字:" +
 name);   
142         System.out.println("性别:" +
 sex);   
143         System.out.println("年龄:" +
 age);   
144 
        System.out   
145                 .println("工作经历:" + Work.getWorkdate() +
 Work.getWorkcompany());   
146 
    }   
147 
  
148     /*
  
149 
     * (non-Javadoc)  
150 
     *   
151 
     * @see java.lang.Object#clone()  
152      */
  
153     public Object clone() throws
 CloneNotSupportedException {   
154         ConcretePrototype cprottotype=(ConcretePrototype)super
.clone();   
155         Work=
(WorkExperience) cprottotype.getWork().clone();   
156         return
 cprottotype;   
157 
    }   
158 
}   
159 
测试类   
160 /**
  
161 
 *   
162 
 * @功能;客户端测试类  
163 
 * @创建人 gao_jie  
164 
 * @创建日期 May 11, 2009  
165 
 * @版本 1.0  
166 
 *   
167  */
  
168 public class
 Client {   
169 
  
170     /**
  
171      * @param
 args  
172      */
  
173     public static void
 main(String[] args) {   
174         Iprototype a = new ConcretePrototype("大鸟"
);   
175         a.setPersonInfo("""29"
);   
176         a.setWorkExperience("2009-12-19""中创软件"
);   
177         Iprototype b = null
;   
178         try
 {   
179             b =
 (ConcretePrototype)a.clone();   
180         } catch
 (CloneNotSupportedException e) {   
181             // TODO Auto-generated catch block   

182             e.printStackTrace();   
183 
        }   
184         b.setPersonInfo("""25"
);   
185         b.setWorkExperience("2008-12-13""中间件"
);   
186 
  
187 
        a.display();   
188 
        b.display();   
189 
    }   
190 
}   
191 
测试结果:   
192 
名字:大鸟   
193 
性别:男   
194 年龄:29
  
195 工作经历:2009-12-
19中创软件   
196 
名字:大鸟   
197 
性别:女   
198 年龄:25
  
199 工作经历:2008-12-
13中间件  
200 

两种方式实现设计模式中的原型模式。