1. 程式人生 > >單例模式+遊戲開發中的設計模式——單例模式

單例模式+遊戲開發中的設計模式——單例模式

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
    }
}