用原型实例指定创建对象的类型,并且通过拷贝这些对象来创建新的对象。
在JAVA中,实现原型模式的方法一般可分为两种:
一种是实现Cloneable接口,使用Object类的静态方法clone()来实现对象的拷贝。
二种是实现serializable接口,使用序列化各反序列化的方式来将对象进行拷贝。
下面分别是两种实现的简单例子:
Cloneable:
package com.prototype.user;
public class User implements Cloneable{
private String name ;
private String password ;
private int age ;
//无参构造
public User(){
}
//带参构造,可使用构造注入
public User(String name , String password , int age ){
this.name = name ;
this.password = password ;
this.age = age ;
}
public String getName() {
return name;
}
//公共的方法,供外部调用,可使用set注入
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//此方法对该对象本身进行拷贝
public Object clone(){
Object obj = null;
try {
//调用Object类的clone()方法,拷贝对象。
obj = super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return obj ;
}
}
package com.prototype.user;
public class TestSerializable {
static void logo( String str ){
System.out.println( str );
}
public static void main(String[] args) {
//产生一个对象使用构造注入
User user1 = new User("wangl" , "12345" , 23);
//执行打印
logo(user1.getName());
logo(user1.getPassword());
logo(((Integer)(user1.getAge())).toString());
//调用对象自身内部的clone()方法将该对象进行一次拷贝
User user2 = (User)user1.clone();
//使用set注入
user2.setName("yyj");
user2.setAge(10);
user2.setPassword("1111");
//执行打印
logo(user2.getName());
logo(((Integer)user2.getAge()).toString());
logo(user2.getPassword());
//执行打印,检测对user2对象修改了以后是否有影响到user1的值。
logo(user1.getName());
logo(((Integer)user1.getAge()).toString());
}
}
serializable:
package com.prototype.serializable;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class User implements Serializable {
private String name;
private String password;
private int age;
// 无参构造
public User() {
}
// 带参构造,可使用构造注入
public User(String name, String password, int age) {
this.name = name;
this.password = password;
this.age = age;
}
public String getName() {
return name;
}
// 公共的方法,供外部调用,可使用set注入
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public User doSerializable() throws IOException, ClassNotFoundException {
User obj = null;
// 序列化
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(this);
//关闭资源
oos.close();
baos.close();
// 反序列化
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
obj = (User) ois.readObject();
ois.close();
bais.close();
return obj;
}
}
package com.prototype.serializable;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class TestSerializable {
static void logo( String str ){
System.out.println( str );
}
public static void main(String[] args)throws Exception {
//产生一个对象使用构造注入
User user1 = new User("wangl" , "12345" , 23);
//执行打印
logo(user1.getName());
logo(user1.getPassword());
logo(((Integer)(user1.getAge())).toString());
//将该对象进行一次拷贝
User user2 = user1.doSerializable();
//使用set注入
user2.setName("yyj");
user2.setAge(10);
user2.setPassword("1111");
//执行打印
logo(user2.getName());
logo(((Integer)user2.getAge()).toString());
logo(user2.getPassword());
//执行打印,检测对user2对象修改了以后是否有影响到user1的值。
logo(user1.getName());
logo(((Integer)user1.getAge()).toString());
}
}