天天看點

設計模式學習筆記——原型模式

原型模式

利用原型模式,可以指定程式中所需的一般類,但是具體類的指定則推遲到執行期間去完成。

看上去很拗口,更多地方隊原型模式的定義是:

通過給出一個原型對象來指明所要建立的對象的類型,然後用複制這個原型對象的辦法建立出更多同類型的對象。

簡單的說,就是通過複制,然後适當的修改,來建立一個新的對象。

在Java中因為有clone(),是以原型模式的實作非常簡單

對于clone()來說,有幾點:

1 它是一個保護方法,隻能在同一個類或者子類内調用

2 隻能複制那些聲明為實作了Cloneable接口的對象。所有數組對象都預設實作了Cloneable接口

3 類為Object的任何對象沒有實作Cloneable,會抛出CloneNotSupported的異常

綜上 我們要把公用,可見的clone方法打包在類中,進而使之可以被通路。

由于clone方法傳回的是一個Object對象,是以必須将它強制轉換成要複制的對象類型

原型模式的基本實作就是基于clone()的

首先,它有一個抽象類,給出了所有具體類所需要的接口等

public class AbstractProduct implements Cloneable{

        .....

	public Object clone() throws CloneNotSupportedException{  
        return super.clone();  
    }
}
           

然後是一個具體的原型,是對抽象類的實作,也是被clone的對象

public class ConcreteProduct extends AbstractProduct{
	......
}
           

最後,我們來建構我們需要的對象

public class Client {
	public static void main(String[] args) throws CloneNotSupportedException {
		AbstractProduct product=new ConcreteProduct();
		AbstractProduct cloneProduct=(AbstractProduct)product.clone();
	}
}
           

 使用原型模式的一些結論

●在運作時,可以根據需要,以複制的方式增加和删除類

●可以基于程式條件,在運作時修改一個類的内部資料表示

●還可以在運作時指定新的對象,而無需建立一系列類和繼承結構

●拷貝原型類的思想以為着可以充分通路這些類中的資料或方法,進而在複制之後将其加以修改。這可能要求向某些原型類增加資料通路方法,一遍複制了類後可以修改資料。

讨論完基礎的原型模式,還有一些必要的補充(這裡的概念copy了某日志 我在最後貼了連結 希望原作者不要介意)

首先,是對于clone方法,clone方法在Java中實作的淺拷貝

被複制對象的所有變量都含有與原來的對象相同的值,而所有的對其他對象的引用都仍然指向原來的對象,換言之, 淺複制僅僅複制所考慮的對象,而不複制它所引用的對象。

而深拷貝

被複制對象的所有的變量都含有與原來的對象相同的值,除去那些引用其他對象的變量。那些引用其他對象的變量将 指向被複制過的新對象,而不再是原有的那些被引用的對象。換言之,深複制把要複制的對象所引用的對象都複制了 一遍,而這種對被引用到的對象的複制叫做間接複制。 

要實作深拷貝,就提到了串行化,有一種技巧,稱作“hack(出租)”。

把一個類寫作為一個位元組流,并且将那些位元組再讀回來重新構造該類,就是串行化。這裡要使用到Serializable接口,同Cloneable類似,他們不含任何方法,隻是一個标示聲明。

public class deepClone{
	public Object deepClone() throws IOException, ClassNotFoundException{ 
	//将對象寫到流裡 
	ByteArrayOutputStream bo = new ByteArrayOutputStream(); 
	ObjectOutputStream oo = new ObjectOutputStream(bo); 
	oo.writeObject(this); 
	//從流裡讀回來 
	ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray()); 
	ObjectInputStream oi = new ObjectInputStream(bi); 
	return (oi.readObject()); 
	}
}
           

 最後,原型模式同單例模式一樣,也有系統資料庫管理式的,實作的原理相似,構造一張表,在複制時進行查找。

關于原型模式,有一些内容來自

http://www.iteye.com/topic/503040

還有一個關于建立型設計模式的部落格

http://icyfenix.iteye.com/blog/575049

對星際争霸熟悉的 看起來會很有思路 非常不錯

另外 關于Java中clone的問題

http://www.iteye.com/topic/483469

給出了一定的研究 可以看看

到此為止 所有的建立型設計模式筆記結束了,一些tips來的小結

工廠模式:根據提供給該工廠的資料,選擇并傳回多個相似類中某個類的一個執行個體

抽象工廠模式:傳回多組類中的一組。在有些情況下,它實際上傳回的是該組類的一個工廠模式

生成器模式:根據所提供的資料,将多個對象組合以得到一個新的對象。通常使用一個工廠模式選擇組合對象的方式

原型模式:當建立新的執行個體代價更大時,可采用拷貝或者複制一個現有類的方法,而不是建立一個新的執行個體。

單例模式:確定一個對象有且隻有一個執行個體,并且可以擷取該執行個體的一個全局通路點

繼續閱讀