文章出處
文章列表
有這樣一個需求,兩個對象,只是名稱以及其他幾個屬性不一樣,而其他的大部分的屬性都是相同的。
這時候我們可以用到原型模式,也就是克隆模式。
原型模式:原型模式是一個對象創建型模式,通過克隆原對象,可以使新對象的數據與原對象數據保持一致。
原型模式是由原對象發起的,創建新對象的方法。
原對象與新對象具備一樣的數據結構以及一樣的值。
克隆模式有淺層克隆和深層克隆之分(主要體現在對引用對象的處理不同)
直接上代碼。
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 }
應用場景:在某些情況下,被創建的對象,不僅僅想擁有其基類的數據結構,也想繼承其基類的數據,這時候可以考慮原型模式。
深度克隆,可以保證原對象和克隆出來的新對象,完全互不影響
克隆的方法是在對象類中實現的。
文章列表
全站熱搜