單例模式+遊戲開發中的設計模式——單例模式
01、設計模式:這是最全面 & 詳細的 單例模式(Singleton)分析指南
https://blog.csdn.net/carson_ho/article/details/52223097
02、單例模式的優缺點
https://blog.csdn.net/iblade/article/details/51107308
何為單例模式
單例模式(singleton):保證只有一個類僅有一個例項,並提供一個訪問他的全域性訪問點。
單例模式有三個要點:一是某個類只能有一個例項;二是它必須自行建立這個例項;三是它必須自行向整個系統提供這個例項。
單例模式是結構最簡單的設計模式一,在它的核心結構中只包含一個被稱為單例類的特殊類。
應用場合
在以下情況下可以考慮使用單例模式:
- (1) 系統只需要一個例項物件,如系統要求提供一個唯一的序列號生成器或資源管理器,或者需要考慮資源消耗太大而只允許建立一個物件。
- (2) 客戶呼叫類的單個例項只允許使用一個公共訪問點,除了該公共訪問點,不能通過其他途徑訪問該例項。
案例+程式碼實現
//單例模式--靜態初始化(餓漢式),,,此外還有多執行緒情況中的雙重鎖定(飽汗式) 也可以實現相同功能
//01建立靜態的私有變數,並例項化(在第一次引用類的任何成員時建立例項)
private static GameFacade _instance = new GameFacade();
//02私有化建構函式(不能再外部例項化,即不能new)
private GameFacade() { }
//03建立全域性唯一訪問點
public static GameFacade Instance { get { return _instance; } }
案例:
將Facade類做成單例模式
using UnityEngine; using System.Collections; using UnityEngine.UI; using UnityEngine.EventSystems; public class GameFacade { //建立遊戲子系統管理的總類Facade(外觀模式) //單例模式--靜態初始化,,,此外還有多執行緒情況中的雙重鎖定 也可以實現相同功能 //01建立靜態的私有變數,並例項化(在第一次引用類的任何成員時建立例項) private static GameFacade _instance = new GameFacade(); private bool mIsGameOver = false;//輔助狀態管理,新增遊戲是否結束,判斷何時切換場景 //單例模式 //03建立全域性唯一訪問點 public static GameFacade Instance { get { return _instance; } } public bool isGameOver {get { return mIsGameOver; }} //單例模式 //02私有化建構函式(不能再外部例項化,即不能new) private GameFacade() { } public void Init () //即MethodOne { //具體的A\B\C\D等子類 } public void Update()//即MethodTwo { //具體的A\B\C\D等子類 } public void Release() //即MethodThree { //具體的A\B\C\D等子類 } }
使用
例:GameFacade.Instance .Init();
using System;
using System.Collections.Generic;
using System.Text;
public class AttackState:ISceneState
{
public AttackState(SceneStateControl controller): base("03AttackScene", controller)
{
}
//private GameFacade mFacade;//做成了單例模式
//建立一個類,管理
//兵營、關卡、角色管理、行動力、成就等子系統系統
//由於Facade類的作用,AttackState可以不用知道具體子類的存在
//使用Facade外觀模式,使AttackState很簡潔,只處理與自身狀態有關的
public override void StateStart()
{
//mFacade.Init();
GameFacade.Instance .Init();//使用FacademethodOne
}
public override void StateEnd()
{
//mFacade.Release();//使用FacademethodTwo
GameFacade.Instance.Release();
}
public override void StateUpdate()
{
if(GameFacade.Instance.isGameOver){
mControler.SetState(new MainState(mControler));
}
GameFacade.Instance.Update();//使用FacademethodThree
}
}