原型模式
利用原型模式,可以指定程式中所需的一般類,但是具體類的指定則推遲到執行期間去完成。
看上去很拗口,更多地方隊原型模式的定義是:
通過給出一個原型對象來指明所要建立的對象的類型,然後用複制這個原型對象的辦法建立出更多同類型的對象。
簡單的說,就是通過複制,然後适當的修改,來建立一個新的對象。
在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來的小結
工廠模式:根據提供給該工廠的資料,選擇并傳回多個相似類中某個類的一個執行個體
抽象工廠模式:傳回多組類中的一組。在有些情況下,它實際上傳回的是該組類的一個工廠模式
生成器模式:根據所提供的資料,将多個對象組合以得到一個新的對象。通常使用一個工廠模式選擇組合對象的方式
原型模式:當建立新的執行個體代價更大時,可采用拷貝或者複制一個現有類的方法,而不是建立一個新的執行個體。
單例模式:確定一個對象有且隻有一個執行個體,并且可以擷取該執行個體的一個全局通路點