設計模式之原型模式

2021-12-30 02:50:21 字數 2365 閱讀 3193

設計模式之原型模式:今天我們繼續來聊下prototype原型模式。這篇應該是關於工廠設計模式的最後一篇。下次就往內部講解結構型別的設計模式。首先我們說下prototype原型模式的用法。prototype原型模式主要是用來處理依賴關係的倒置。 比如抽象a類依賴了實現細節b:

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

那現在 我們的小車就依賴於抽象類發動機,然後不管電動還是汽油發動機都依賴於抽象類發動機。下面來看點**的具體實現。 假設我們現在做一套機械人ai。那麼機械人分為普通機械人,飛行機械人,水下機械人。那麼我們先來製作這些機械人原型,來體現出我們的prototype原型模式的用法。

public abstract class normalrobot

首先我們宣告乙個抽象類 普通機械人。 然後這個普通機械人有乙個抽象的clone方法,並返回這個抽象類。接下來再來寫2個原型類。

public class normalrobota : normalrobot }

public class normalrobotb : normalrobot

}現在我們又構建了2個ab號的普通機械人。重寫了clone方法。這裡提一下this.memberwiseclone();使用的是.net的乙個深度複製方法,目的就是要把我們的原型,資料內容重新轉殖一次,然後返回出去。 這個深度複製這裡我就不展開了,想了解詳細的話就自行百度下吧。好,那我們現在普通機械人的原型做好了,我們再來加上飛行機械人和水下機械人,然後再來說用法。

public abstract class flyrobot

public class flyrobota : flyrobot

}public class flyrobotb : flyrobot}

public abstract class waterrobot

public class waterrobota : waterrobot

}public class waterrobotb : waterrobot

}好,現在我們再來寫乙個構造器 目的就是呼叫這3種機械人型別。

public class gamesystem

}可以看到,構造器主要是傳3個引數,分別就是機械人的抽象類。然後在類裡面重新new出3個抽象類來接收這些引數。然後使用引數的.clone方法來賦值。好,最後我們來寫這個啟動**,來呼叫這個構造器並且傳輸引數試試。

class program

}可以看到,在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開始,當遇到更多的複雜變化時,再考慮重構為其他三種工廠模式。

設計模式之原型模式

原型模式其實就是從乙個物件再建立乙個可定製的物件,而且不需要知道建立的細節。具體就是說通過複製或者轉殖乙個原型物件產生新的物件 轉殖物件 分為兩種 深複製或者淺複製,這兩種的主要區別是 在原型中如果有物件的引用,淺複製是將引用複製過來了,也就是淺複製和原型中的物件的引用相同,而深複製是將轉殖物件中引...

設計模式之原型模式

include include 此練習為原型模式方法的練習 原型模式揭示了在同一原型上可以通過複製使得 只需要例項化一次,再通過相應的類函式操作可以得到 同一原型下的不同的版本物件 此練習將考慮在實際開發中 比如 工作經歷也是作為乙個類被含在簡歷類中的情況 這情況將涉及到類的引用和深 淺複製 原型基...

設計模式之原型模式

原型模式的思想就是將乙個物件作為原型,對其進行複製 轉殖,產生乙個和原物件類似的新物件 複製過程可分為淺複製和深複製。淺複製是指直接呼叫父類 即object類 的clone方法 super.clone 該方法是本地 native 方法,呼叫該方法clone出來的新物件,基本資料型別的屬性變數是新建立...