【設計模式-2】單例模式
優點:
- 記憶體在系統執行過程中只有一個例項,減少記憶體開銷。
- 允許可變數目的例項
- 其他類通過唯一的全域性例項,可以方便訪問單例中的方法和變數。
- 單例可在第一次使用時候,進行例項化,不必在系統剛啟動就初始化。一定程度上可以控制自己例項化程序。
缺點:
- 過多的其他類中通過單例訪問全域性方法和變數,可能跟其他類造成過度耦合。
- 沒有介面擴充套件困難
- 過多的單例,造成效能問題
適用場景:
- 資源共享的情況下,避免由於資源操作時導致的效能或損耗等。如上述中的日誌檔案,應用配置。
- 控制資源的情況下,方便資源之間的互相通訊。如執行緒池等。
- 需要定義大量的靜態常量和靜態方法(如工具類)的環境,可以採用單例模式
Unity3d中實現單例泛型類方法:
public class UnitySingleton<T> : MonoBehaviour where T:Component {
private static T _instance;
public static T GetInstance()
{
if(_instance == null)
{
//如果沒有型別為T的類物件
_instance = FindObjectOfType(typeof(T)) as T;
if(_instance == null)
{
GameObject tempObject = new GameObject ();
tempObject.hideFlags = HideFlags.HideAndDontSave;
_instance = (T) tempObject.AddComponent(typeof(T));
Object.DontDestroyOnLoad(tempObject);
}
}
return _instance;
}
}
某個類需要單例,繼承即可,如下:
public class YourSelfScriptName :UnitySingleton<YourSelfScriptName>
{
}
單例模式比靜態方法的優點:
從另一個角度考慮,如果一個方法和它所在類的例項物件無關,那麼它就應該是靜態的,否則就應該是非靜態。因此像工具類,一般都是靜態的。
- 單例可以繼承類,實現介面,而靜態類不能(可以整合類,但不能整合例項成員);
- 單例可以被延遲初始化,靜態類一般在第一次載入是初始化;
- 單例類可以被整合,單例裡邊的方法可以被重寫;
- 最重要的是,單例類可以被用於多型而無需強迫使用者只假定唯一的例項。舉個例子,你可能在開始時只寫一個配置,但是以後你可能需要支援超過一個配置集,或者可能需要允許使用者從外部從外部檔案中載入一個配置物件,或者編寫自己的。你的程式碼不需要關注全域性的狀態,因此你的程式碼會更加靈活(允許可變數目的例項)
參考:
https://blog.csdn.net/yupu56/article/details/54144262