用原型实例指定创建对象的类型,并且通过拷贝这些对象来创建新的对象。
在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());
  
  
 }
}