Prototype(java原型模式)

java 原型模式

轉http://luchar.iteye.com/blog/179624

一、原型模式定義
     用原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象.

     Prototype模式允許一個對象再創建另外一個可定製的對象,根本無需知道任何如何創建的細節。

     工作原理是:通過將一個原型對象傳給那個要發動創建的對象,這個要發動創建的對象通過請求原型對象拷貝它們自己來實施創建。

 

二、如何使用
     因爲Java中的提供clone()方法來實現對象的克隆,所以Prototype模式實現一下子變得很簡單.


三、實例

Java代碼  
  1. public abstract class AbstractSpoon implements Cloneable{  
  2.   String spoonName;  
  3.   
  4.   public void setSpoonName(String spoonName) {  
  5.             this.spoonName = spoonName;  
  6.       }  
  7.   public String getSpoonName() {return this.spoonName;}  
  8.   
  9.   public Object clone(){  
  10.     Object object = null;  
  11.     try {  
  12.       object = super.clone();  
  13.     } catch (CloneNotSupportedException exception) {  
  14.       System.err.println("AbstractSpoon is not Cloneable");  
  15.     }  
  16.     return object;  
  17.   }  
  18. }  

 有個具體實現(ConcretePrototype):

Java代碼  
  1. public class SoupSpoon extends AbstractSpoon{  
  2.   public SoupSpoon(){  
  3.     setSpoonName("Soup Spoon");  
  4.   }  
  5. }  
 

調用Prototype模式很簡單:

AbstractSpoon spoon = new SoupSpoon();
AbstractSpoon spoon2 = spoon.clone();

當然也可以結合工廠模式來創建AbstractSpoon實例。

在Java中Prototype模式變成clone()方法的使用,此方法執行的是該對象的“淺表複製”,而不“深層複製”操作。


四、說明:
克隆必須滿足的條件:

a.對任何的對象x,都有:x.clone() != x,即克隆對象與原對象不是同一個對象。
b.對任何的對象x,都有:x.clone().getClass() == x.get getClass(),即克隆對象與原對象的類型是一樣的。 c.如果對象x的equals()方法定義恰當的話,那麼x.clone().equals(x)應當是成立的。
在java中實現clone()應該滿足這三個條件。

淺複製:複製了值類型對象,對於引用類型對象,只複製了引用,它指向原來引用的對象。Java中clone爲淺複製。
深複製:對值類型和引用類型的對象都生成一份新的拷貝. Java中可以通過串行化來進行深複製,前提是對象以及對象內部所引用的對象都是可串行化的,否則需要考慮將那些不可串行化的對象可否設爲transient,排除在複製過程之外。

淺克隆:被克隆對象的所有變量都含有與原來的對象相同的值,而它所有的對其他對象的引用都仍然指向原來的對象。換一種說法就是淺克隆僅僅克隆所考慮的對象,而不克隆它所引用的對象。

    深克隆:被克隆對象的所有變量都含有與原來的對象相同的值,但它所有的對其他對象的引用不再是原有的,而這是指向被複制過的新對象。換言之,深複製把要複製的對象的所有引用的對象都複製了一遍,這種叫做間接複製。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章