設計模式深入學習——Prototype原型模式

今天我們繼續來聊下Prototype原型模式。這篇應該是關於工廠設計模式的最後一篇。下次就往內部講解結構類型的設計模式。

首先我們說下Prototype原型模式的用法。Prototype原型模式主要是用來處理依賴關係的倒置。 比如抽象A類依賴了實現細節B,

拿我們上個帖子舉例,比如我們的小車依賴於汽油發動機。 但是當我們的小車不使用汽油發動機,改用電動了,那這時候修改起來就比較痛苦了。所以我們採用抽象A依賴於抽象B,實現細節b依賴於抽象B。

那現在 我們的小車就依賴於抽象類發動機,然後不管電動還是汽油發動機都依賴於抽象類發動機。

下面來看點代碼的具體實現。 假設我們現在做一套機器人AI。那麼機器人分為普通機器人,飛行機器人,水下機器人。那麼我們先來製作這些機器人原型,來體現出我們的Prototype原型模式的用法。

首先我們聲明一個抽象類 普通機器人。 然後這個普通機器人有一個抽象的Clone方法,並返回這個抽象類。接下來再來寫2個原型類。

現在我們又構建了2個AB號的普通機器人。重寫了Clone方法。這裡提一下this.MemberwiseClone(); 使用的是。net的一個深度複製方法,目的就是要把我們的原型

數據內容重新克隆一次,然後返回出去。 這個深度複製這裡我就不展開了,想了解詳細的話就自行百度下吧。

好,那我們現在普通機器人的原型做好了,我們再來加上飛行機器人和水下機器人,然後再來說用法。

好,現在我們再來寫一個構造器 目的就是調用這3種機器人類型。

可以看到,構造器主要是傳3個參數,分別就是機器人的抽象類。然後在類裡面重新new出3個抽象類來接收這些參數。然後使用參數的.Clone方法來賦值。

好,最後我們來寫這個啟動代碼,來調用這個構造器並且傳輸參數試試。

可以看到,在Main函數中,我先new了一個構造器,然後分別往構造器傳輸 普通機器人A,飛行機器人A,水下機器人B。然後我們運行就可以看到每個類型的機器人都響應了。

這個就是Prototype原型模式的設計運用,他的好處就是使用一個原型來作為基礎參數構造,然後通過構造的過程可以隨意修改,解決了在製作的過程中修改抽象類而具體實現類不需要改變的耦合性。比如說這個時候我們的飛行機器人加了C類型,那麼我們就可以在寫一個新的飛行機器人C類,繼承自飛行機器人抽象類,然後把這個飛行機器人C類實現好後,就可以修改下啟動函數的飛行機器人C類傳入構造器就可以了,是不是特別方便呢。

我們再來看看Prototype原型模式的幾個設計要點。

prototype設計模式同樣用於隔離類對象的使用者和具體類型(易變類)之間的耦合關係,它同樣要求這些"易變類"擁有"穩定的接口"。

prototype設計模式對於"如何創建易變類的實體對象"採用"原型克隆"的方法來做,它使得我們可以非常靈活地動態創建"擁有某些穩定接口"的新對象--所需工作僅僅是註冊一個新類的對象(即原型),然後在任何需要的地方不斷地Clone。

prototype設計模式中的Clone方法可以利用.NET中的Object類中的MemberwiseClone()方法或者序列化來實現深度複製。

最後再來回顧下我們全部的工廠設計模式的方案。

Singleton模式解決的是實體對象個數的問題。除了Singleton之外,其他創建型模式解決的都是new所帶來的耦合關係。

Factory Method,AbstractFactory,Builder都需要一個額外的工廠類來負責實例化"易變對象",而Prototype則是通過原型(一個特殊的工廠類)來克隆"易變對象"

如果遇到"易變類",起初的設計通常從Factory Method開始,當遇到更多的複雜變化時,再考慮重構為其他三種工廠模式(Abstract Factory,Builder,Prototype).

和往常一樣,後面提供示例工程。

Factory Method,AbstractFactory,Builder都需要一個額外的工廠類來負責實例化"易變對象",而Prototype則是通過原型(一個特殊的工廠類)來克隆"易變對象"

如果遇到"易變類",起初的設計通常從Factory Method開始,當遇到更多的複雜變化時,再考慮重構為其他三種工廠模式(Abstract Factory,Builder,Prototype).