代碼說明
l Enemy類是抽象原型,它有兩個用途,一是定義了原型的一些抽象內容,二是定義了原型模式必須的拷貝方法。在這裡,我們看到,每個敵人的屬性有位置、攻擊力、速度等,並且能通過ShowInfo()方法來獲取這個人的信息。
l FootMan類就是具體原型了,它顯示了敵人的具體參數以及實現了克隆自身。
l GameScene類就是調用方,在這裡我們並沒有看到有和具體原因進行依賴,通過復制傳入的克隆原型,得到一些新的敵人,在原型的基礎上稍微調整一下就變成了一支敵人部隊。
l 原型模式通過對原型進行克隆來替代無數子類,因此也就減少了調用方和具體類型產生依賴的程序。
l Clone()方法接受一個參數,表示是否是深拷貝。在這裡,我們通過序列化反序列化實現深拷貝,深拷貝實現對象的完整復制,包括對象內部的引用類型都會復制一份全新的。在這裡,如果3個敵人對象的Location都指向內存同一個地址的話,那麼它們就分不開了,因此,在復制的時候需要進行深拷貝,使得它們的Location是獨立的。
l 在初始化Enemy的時候,我們Sleep()了一下,目的是模擬對象的創建是一個非常耗時的工作,這也體現了原型模式的另一個優勢,在生成敵人的時候,我們其實無需再做這些工作了,我們只需要得到它的完整數據,並且進行一些修改就是一個新的敵人。
l 運行程序後可以看到,雖然創建了三個敵人,但是只耗費了一個敵人的創建時間,三個敵人都是從原型克隆出來的。由於進行了深拷貝,修改了一個敵人的位置並不會影響其它敵人。