文章出處

有這樣一個需求,兩個對象,只是名稱以及其他幾個屬性不一樣,而其他的大部分的屬性都是相同的。

這時候我們可以用到原型模式,也就是克隆模式

原型模式:原型模式是一個對象創建型模式,通過克隆原對象,可以使新對象的數據與原對象數據保持一致。

原型模式是由原對象發起的,創建新對象的方法。

原對象與新對象具備一樣的數據結構以及一樣的值。

克隆模式有淺層克隆和深層克隆之分(主要體現在對引用對象的處理不同)

 

直接上代碼。

1.創建一個書類,書有幾個屬性,名稱,書頁數,出版單位,作者等。

2.實現克隆模式,java的話需要實現cloneable接口

3.在類中實現克隆的方法,本例中有淺層克隆和深層克隆兩種方法。區別在于對引用對象的處理。

 1 import java.util.ArrayList;
 2 import java.util.List;
 3 
 4 public class Book implements Cloneable{  //原型模式需要實現cloneable接口
 5     private String name;
 6     private int number;
 7     private String company;
 8     private List<String> author;      //指向的是一個引用的空間
 9     public String getName() {
10         return name;
11     }
12     public void setName(String name) {
13         this.name = name;
14     }
15     public int getNumber() {
16         return number;
17     }
18     public void setNumber(int number) {
19         this.number = number;
20     }
21     public String getCompany() {
22         return company;
23     }
24     public void setCompany(String company) {
25         this.company = company;
26     }
27     
28     public List<String> getAuthor() {
29         return author;
30     }
31     public void setAuthor(List<String> author) {
32         this.author = author;
33     }
34     
35     //淺層克隆,clone以后引用會保持一致,當引用對象發生改變,兩個克隆對象就會發生改變
36     public Book ShallowClone(){
37         try {
38             return (Book) super.clone();
39         } catch (CloneNotSupportedException e) {
40             // TODO Auto-generated catch block
41             e.printStackTrace();
42             return null;
43         }
44     }
45     //深度克隆,需要對有引用的地方進行操作
46     public Book DepthClone(){
47         try {
48             Book book=(Book)super.clone();
49             List<String> authors=new ArrayList<String>();
50             for(String author:this.getAuthor()){
51                 authors.add(author);
52             }
53             book.setAuthor(authors);
54             return book;
55         } catch (CloneNotSupportedException e) {
56             // TODO Auto-generated catch block
57             e.printStackTrace();
58             return null;
59         }    
60     }
61 }

4.主客戶端測試代碼

 1 import java.util.ArrayList;
 2 import java.util.List;
 3 
 4 //原型模式也叫克隆模式
 5 public class MainClass {
 6     public static void main(String[] args) {
 7         Book book1=new Book();                  //實例化一個book1
 8         book1.setName("shujujiegou");
 9         book1.setNumber(100);
10         book1.setCompany("TomCompany");
11         List<String>author=new ArrayList<>();
12         author.add("Tom");
13         author.add("WhiteTaken");
14         book1.setAuthor(author);
15         
16         Book book2=book1.ShallowClone();        //實例化一個book2,調用book1的淺層克隆方法
17         book1.setName("數據結構");            //淺層克隆,引用指向同一個,但是String等類型的值直接克隆
18         author.add("Langer");              //修改book1的值,淺層克隆book1和book2指向的是同一個引用,打印的值相同
19     
20         System.out.println(book1.getName());
21         System.out.println(book1.getNumber());
22         System.out.println(book1.getCompany());    
23         System.out.println(book1.getAuthor());
24         
25         System.out.println(book2.getName());
26         System.out.println(book2.getNumber());
27         System.out.println(book2.getCompany());
28         System.out.println(book2.getAuthor());
29         
30         System.out.println("==================");
31         
32         Book book3=book1.DepthClone();          //實例化一個book3,調用book1的深層克隆方法
33         author.add("KZMASTER");              //修改book1的引用值,book3沒有變化
34         System.out.println(book1.getAuthor());
35         System.out.println(book3.getAuthor());
36     }
37 }

應用場景:在某些情況下,被創建的對象,不僅僅想擁有其基類的數據結構,也想繼承其基類的數據,這時候可以考慮原型模式。

深度克隆,可以保證原對象和克隆出來的新對象,完全互不影響

克隆的方法是在對象類中實現的。

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()