何時采用
l 從代碼角度來說, 如果你希望運行時指定具體類(比如是使用Footman作為敵人還是使用其它),或者你希望避免創建對象時的初始化過程(如果這個過程占用的時間和資源都非常多),或者是希望避免使用工廠方法來實現多態的時候,可以考慮原型模式。
l 從應用角度來說, 如果你創建的對象是多變化、多等級的產品,或者產品的創建過程非常耗時的時候(比如,有一定的計算量,或者對象創建時需要從網絡或數據庫中獲取一定的數據),或者想把產品的創建獨立出去,不想了解產品創建細節的時候可以考慮使用。不得不說,原型模式給了我們多一種創建對象,並且不依賴具體對象的選擇。
實現要點
l .Net中使用Object的MemberwiseClone()方法來實現淺拷貝,通過序列化和反序列化實現深拷貝,後者代價比較大,選擇何時的拷貝方式。
l 原型模式同樣需要抽象類型和具體類型,通過相對穩定的抽象類型來減少或避免客戶端的修改可能性。
l 在代碼中,我們把敵人作為了抽象類型,抽象層次很高。完全可以把步兵作為抽象類型,下面有普通步兵,手榴彈步兵等等,再有一個坦克作為抽象類型,下面還有普通坦克和防導彈坦克。這樣GameScene可能就需要從兩種抽象類型克隆出許多步兵和坦克。不管怎麼樣抽象,只要是對象類型由原型實例所指定,新對象通過原型實例做拷貝,那麼這就是原型模式。
注意事項
l 注意選擇深拷貝和淺拷貝。
l 拷貝原型並進行修改意味著原型需要公開更多的數據,對已有系統實現原型模式可能修改的代價比較大。