• 原型模式


    原型模式属于对象的创建模式。通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象。

    原型模式又分为浅拷贝和深拷贝模式,类中只有简单数据类型的拷贝属于浅拷贝,如:

     1 class Prototype implements Cloneable{
     2     private int id;
     3     private String name;
     4     public int getId() {
     5         return id;
     6     }
     7     public void setId(int id) {
     8         this.id = id;
     9     }
    10     public String getName() {
    11         return name;
    12     }
    13     public void setName(String name) {
    14         this.name = name;
    15     }
    16     
    17     public Object clone(){
    18         Prototype p = null;
    19         try {
    20             p = (Prototype) super.clone();
    21         } catch (CloneNotSupportedException e) {
    22             e.printStackTrace();
    23         }
    24         return p;
    25     }
    26 }

    当类中持有其他类的对象的实例时,需要使用深拷贝,深拷贝又有两种方法,第一种是将持有的对象再分别进行浅拷贝,这种方法适合持有少量对象:

     1 class Person implements Cloneable{
     2     private int id;
     3     private String name;
     4     public int getId() {
     5         return id;
     6     }
     7     public void setId(int id) {
     8         this.id = id;
     9     }
    10     public String getName() {
    11         return name;
    12     }
    13     public void setName(String name) {
    14         this.name = name;
    15     }
    16     
    17     public Object clone(){
    18         Person person = null;
    19         try{
    20             person = (Person) super.clone();
    21         }catch (CloneNotSupportedException e) {
    22             e.printStackTrace();
    23         }
    24         return person;
    25     }
    26 }
    27 
    28 class Prototype implements Cloneable{
    29     private boolean flag;
    30     private Person person;
    31     public boolean isFlag() {
    32         return flag;
    33     }
    34     public void setFlag(boolean flag) {
    35         this.flag = flag;
    36     }
    37     public Person getPerson() {
    38         return person;
    39     }
    40     public void setPerson(Person person) {
    41         this.person = person;
    42     }
    43     
    44     public Object clone(){
    45         Prototype p = null;
    46         try{
    47             p = (Prototype) super.clone();
    48             p.person = (Person) person.clone();
    49         }catch(CloneNotSupportedException e){
    50             e.printStackTrace();
    51         }
    52         return p;
    53     }
    54 }

    另一种深拷贝的方法就是使用序列化:

     1 import java.io.ByteArrayInputStream;
     2 import java.io.ByteArrayOutputStream;
     3 import java.io.IOException;
     4 import java.io.ObjectInputStream;
     5 import java.io.ObjectOutputStream;
     6 import java.io.Serializable;
     7 
     8 class Person implements Cloneable{
     9     private int id;
    10     private String name;
    11     public int getId() {
    12         return id;
    13     }
    14     public void setId(int id) {
    15         this.id = id;
    16     }
    17     public String getName() {
    18         return name;
    19     }
    20     public void setName(String name) {
    21         this.name = name;
    22     }
    23     
    24     public Object clone(){
    25         Person person = null;
    26         try{
    27             person = (Person) super.clone();
    28         }catch (CloneNotSupportedException e) {
    29             e.printStackTrace();
    30         }
    31         return person;
    32     }
    33 }
    34 
    35 class Prototype implements Serializable{
    36     private boolean flag;
    37     private Person person;
    38     public boolean isFlag() {
    39         return flag;
    40     }
    41     public void setFlag(boolean flag) {
    42         this.flag = flag;
    43     }
    44     public Person getPerson() {
    45         return person;
    46     }
    47     public void setPerson(Person person) {
    48         this.person = person;
    49     }
    50     
    51     public Object clone() {
    52         try{
    53             ByteArrayOutputStream bos = new ByteArrayOutputStream();
    54             ObjectOutputStream oos = new ObjectOutputStream(bos);
    55             oos.writeObject(oos);
    56             
    57             ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());  
    58             ObjectInputStream ois = new ObjectInputStream(bis);  
    59             return ois.readObject();
    60         }catch(IOException e){
    61             e.printStackTrace();
    62         }catch(ClassNotFoundException e){
    63             e.printStackTrace();
    64         }
    65         return null;
    66     }
    67 }
  • 相关阅读:
    MySQL max_allowed_packet设置及问题
    centos 7 编译安装mysql 详细过程
    如何快速查看mysql数据文件存放路径?
    centos yum 库更新
    centos 7 ifconfig 命令找不到
    http协议
    前端那些事儿
    C++接口的定义与实现的详细过程
    List转为字符串
    spring cloud spring boot JPA 克隆对象修改属性后 无法正常的执行save方法进行保存或者更新
  • 原文地址:https://www.cnblogs.com/gsbm/p/4782445.html
Copyright © 2020-2023  润新知