zoukankan      html  css  js  c++  java
  • 原型模式

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

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

     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 }
  • 相关阅读:
    POJ 3710 Christmas Game#经典图SG博弈
    POJ 2599 A funny game#树形SG(DFS实现)
    POJ 2425 A Chess Game#树形SG
    LeetCode Array Easy 122. Best Time to Buy and Sell Stock II
    LeetCode Array Easy121. Best Time to Buy and Sell Stock
    LeetCode Array Easy 119. Pascal's Triangle II
    LeetCode Array Easy 118. Pascal's Triangle
    LeetCode Array Easy 88. Merge Sorted Array
    ASP.NET MVC 学习笔记之 MVC + EF中的EO DTO ViewModel
    ASP.NET MVC 学习笔记之面向切面编程与过滤器
  • 原文地址:https://www.cnblogs.com/gsbm/p/4782445.html
Copyright © 2011-2022 走看看