Unity幾種常用的設計模式
阿新 • • 發佈:2019-02-11
1、單例模式:某個類只能有一個例項,單例非常重要,比如我需要管理遊戲的UI,現在我要關閉某個頁面,頁面上可能開啟很多子視窗也需要一起關閉,這時候用一個單例來統一管理就很好解決這個問題。單例模式一般都是xxxController、xxxManager等,可以這麼寫。
2、命令模式:命令模式就是將物件的狀態和行為進行封裝後按照一定的規則進行處理的模式。可以把行為的請求者和行為的實現者分開,比如現在需要在遊戲中開啟錄製,則需要記錄輸入的指令,如果行為的請求者和實現者緊耦合(按下按鍵就執行)是不利於實現錄製的。這個模式的優點第一個是減低耦合度,比如上面這個例子。其次因為請求者和實現著分開,我們可以對請求的指令做很多操作,比如增加新的指令,修改指令等。我實際遇到的有個例子是模組之間的通訊,比如我的遊戲有登入模組和網路模組,當登入模組收的登入資訊時需要通過網路模組傳送資訊給伺服器進行驗證,如果直接呼叫網路模組的XXX函式,假設這個函式還沒寫甚至還沒寫網路模組,遊戲就不能執行除錯,這時候可以寫一個模組管理器,如果需要呼叫另一個模組的函式,則通過傳送一個訊息給模組管理器來發送資訊,如果模組不存在就快取資訊,等有的時候再發送過去。這屬於靜態解耦,就是編譯上解耦,即使另一個模組還沒有的時候也能執行。
3、觀察者模式,對應的就是事件機制,通過新增監聽者來獲取狀態變化。觀察者模式在模組之間劃定了清晰的界限,提高了應用程式的可維護性和重用性(本句來自百度百科)。用我自己的理解解釋一下上面那句,使用觀察者模式可以避免類之間的直接呼叫,減少耦合,就是說類A需要監聽類B,但是即使類B不在,也是可以執行的。遇到的例子有下層和上層的通訊,框架在設計上是保持單向依賴的,即上層依賴下層,檢視層從業務層獲取資料,業務層依賴基礎類庫。但是下層也需要獲得上層的狀態變化,為了不違反單向依賴的原則就可以使用觀察者模式監聽上層來獲取狀態變化。
4、MVC模式:這個圖是在某個部落格偷的哈哈哈,談談我的理解就好
控制器:處理資料,計算資料
模型:儲存資料,可以說是一個數據模型
檢視:呈現Model的資料
在我遇到的情況中,控制器都是單例,模型就是資料,可能從工廠建立,然後給控制器管理,而檢視物件可以由模型通過檢視工廠來建立。
5、工廠模式:當一種型別需要經常被大量建立和銷燬的時候,為了提高效率可以不銷燬,而是先儲存起來,等需要的時候再拿去用。以前我是通過獲取特定指令碼來管理物件,每次都要去getcomponent看看有沒有物件指令碼來確定是不是要由工廠管理,這樣效率比較低。有了mvc模式,可以直接管理模型,銷燬一個物件可以這樣寫。
xxxController中的ReleastInFactory(ModelA) { .....Factory.Instance.Release(ModelA);..... }
Factory中的Release(ModelA) { ...ModelA.Release()...Push(ModelA).. } //Push可以用字典分型別存吧,不寫了
ModelA中的Release() { ......View.SetActive(false); ...... }
寫錯的地方求指點一下~
public abstract class SingleTon<T> where T : SingleTon<T>, new() { private static SingleTon<T> _instance = null; public static SingleTon<T> Instance { get { if(_instance == null) _instance = new T(); return _instance; } } public virtual void Init() { Debug.Log("Sington<T>..."); } } public class UIManager : SingleTon<UIManager> { //亂七八糟的東西 }
2、命令模式:命令模式就是將物件的狀態和行為進行封裝後按照一定的規則進行處理的模式。可以把行為的請求者和行為的實現者分開,比如現在需要在遊戲中開啟錄製,則需要記錄輸入的指令,如果行為的請求者和實現者緊耦合(按下按鍵就執行)是不利於實現錄製的。這個模式的優點第一個是減低耦合度,比如上面這個例子。其次因為請求者和實現著分開,我們可以對請求的指令做很多操作,比如增加新的指令,修改指令等。我實際遇到的有個例子是模組之間的通訊,比如我的遊戲有登入模組和網路模組,當登入模組收的登入資訊時需要通過網路模組傳送資訊給伺服器進行驗證,如果直接呼叫網路模組的XXX函式,假設這個函式還沒寫甚至還沒寫網路模組,遊戲就不能執行除錯,這時候可以寫一個模組管理器,如果需要呼叫另一個模組的函式,則通過傳送一個訊息給模組管理器來發送資訊,如果模組不存在就快取資訊,等有的時候再發送過去。這屬於靜態解耦,就是編譯上解耦,即使另一個模組還沒有的時候也能執行。