【設(shè)計模式】單例模式淺析

引子

在學(xué)習(xí)編程之初我們就知道使用靜態(tài)方法或者是靜態(tài)變量就可以在其他類中使用那個方法那個變量附鸽,但是老師就告訴我們能不用靜態(tài)方法就不用脱拼,因為靜態(tài)的不能繼承巴拉巴拉...就一直很怕使用靜態(tài),直到單例的出現(xiàn)坷备。感覺人生一下子就豁然開朗熄浓。單例與靜態(tài)的區(qū)別 看完了這個總有一種誤會靜態(tài)的感受。哈哈哈省撑。


既然是單例赌蔑,就意味著就只能有一個對象俯在,所以他的構(gòu)造函數(shù)肯定是私有的。

public class MyClass
{
  private MyClass()
  {
  }
}

簡而言之就是這樣了娃惯,這個是我在平時寫的時候經(jīng)常忘記寫的一個跷乐,當(dāng)然不寫也不會報錯,個人覺得寫上還是嚴(yán)謹(jǐn)一些嘛趾浅,哈哈愕提。當(dāng)然繼承于MonoBehriour的類是不建議new的嘛,new的話unity也會給你報警告的皿哨。當(dāng)然如果還是要在實例化對象的話浅侨,就可以不加這個私有構(gòu)造方法。就給大家說說我都用過那幾種寫法嘛往史。下面的例子就不寫這個方法仗颈。


最簡單Awake

public class MyClass : MonoBehaviour
{
    public static MyClass instance;
    public void Awake()
    {
        instance = this;
    }
}

這樣的寫法是最簡單的,也是最粗暴的椎例。當(dāng)然一般這樣的寫法按照常規(guī)劇本走的話挨决,到后面都不會有好的結(jié)果。用了這個的話在多線線程中是不能好好跟你玩耍的订歪。其實在做一些小demo還是可以這個滴,畢竟簡單嘛盖高。

不繼承于MonoBehavior常規(guī)類

public class MyClass
{
    public static MyClass Instance
    {
        get { return Nest.instance; }
    }

    private class Nest
    {
        static Nest()
        {
        }
        internal static readonly MyClass instance = new MyClass();
    }
}

這種是靜態(tài)內(nèi)部類喻奥,既是線程安全又沒有消耗太多捏悬。

繼承于MonoBehavior

using UnityEngine;

public class MyClass : MonoBehaviour
{
    private static MyClass instance;

    public static MyClass Instance
    {
        get
        {
            if (!instance)
            {
                instance = (MyClass) FindObjectOfType(typeof (MyClass));
                if (!instance)
                {
                    Debug.LogError("There needs to be one active MyClass script on a GameObject in your scene");
                }
            }
            return instance;
        }
    }
}

這個寫法是一定要這個腳本掛在游戲物體上的过牙。


平時寫代碼時我們不可能在每一個要使用的單例模式的類中都寫上上面的代碼,太麻煩了刀疙,下面給大家介紹兩種之前遇到的兩種簡便方法扫倡。


單例模板基類

using UnityEngine;
public class Singleton<T> : MonoBehaviour where T : class
{
    protected static T instance;
    public static T Instance
    {
        get
       {
            if (null == instance)
            {
                var type = typeof (T);
                if (type.IsAbstract || type.IsInterface)
                {
                    throw (new Exception("Class type must could be instantiated. Don't use abstract or interface"));
                }
                if (!type.IsSealed)
                {
                    throw (new Exception("Class type must be a sealed. Use sealed"));
                }
                var constructor = type.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic,
                    null,
                    SType.EmptyTypes,
                    null);
                if (null == constructor)
                {
                    throw (new Exception("Constructor must empty"));
                }
                if (!constructor.IsPrivate)
                {
                    throw (new Exception("Constructor must be a private function"));
                }
                instance = constructor.Invoke(null) as T;
            }
            return instance;
        }
    }
}

這個模板可以繼承于monobehaviour也可以不用油够,繼承于這個基類的類是不能有派生的

變量型單例

using UnityEngine;
public class InstanceManager : MonoBehaviour
{
   private static InstanceManager instance;

   public static InstanceManager Instance
  {
      get
      {
          if (!instance)
          {
              instance = (InstanceManager) FindObjectOfType(typeof (InstanceManager));
              if (!instance)
              {
                  Debug.LogError("There needs to be one active MyClass script on a GameObject in your scene");
              }
          }
          return instance;
      }
  }

  #region add public script
        public start Start;
  #endregion
}

細(xì)心的你肯定發(fā)現(xiàn)了這樣的寫法與上面繼承于monobehaviour的方式是一樣的石咬,后面加了一個公共的類的變量,這個類就是咱們需要使用的的單例類删性。當(dāng)然這個管理單例腳本也要掛在游戲物體上焕窝,只需要在外面給其賦值。(當(dāng)然也可以動態(tài)賦值巴帮,雖然沒有動態(tài)賦值過榕茧,不過可以試試)


直接賦值

綜合看起來個人覺得第一種模板基類跟適合用來不用放在場景中一些管理器客给,第二種就適合在場景用到的一些單例腳本。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蜻拨,一起剝皮案震驚了整個濱河市缎讼,隨后出現(xiàn)的幾起案子休涤,更是在濱河造成了極大的恐慌笛辟,老刑警劉巖手幢,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件围来,死亡現(xiàn)場離奇詭異,居然都是意外死亡桶错,警方通過查閱死者的電腦和手機(jī)胀蛮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門粪狼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人狡刘,你說我怎么就攤上這事困鸥。” “怎么了澜术?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵瘪板,是天一觀的道長漆诽。 經(jīng)常有香客問我,道長厢拭,這世上最難降的妖魔是什么供鸠? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任楞捂,我火速辦了婚禮,結(jié)果婚禮上寨闹,老公的妹妹穿的比我還像新娘。我一直安慰自己繁堡,他們只是感情好乡数,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布净赴。 她就那樣靜靜地躺著罩润,像睡著了一般。 火紅的嫁衣襯著肌膚如雪烧栋。 梳的紋絲不亂的頭發(fā)上拳球,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機(jī)與錄音魔吐,去河邊找鬼莱找。 笑死,一個胖子當(dāng)著我的面吹牛辞色,可吹牛的內(nèi)容都是我干的浮定。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼立美,長吁一口氣:“原來是場噩夢啊……” “哼建蹄!你這毒婦竟也來了裕偿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤拢蛋,失蹤者是張志新(化名)和其女友劉穎蔫巩,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體垃瞧,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡个从,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年歪沃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奕污。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡碳默,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嘱根,到底是詐尸還是另有隱情巷懈,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布凑保,位于F島的核電站愉适,受9級特大地震影響癣漆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜惠爽,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一婚肆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧较性,春花似錦结胀、人聲如沸糟港。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽歹垫。三九已至,卻和暖如春排惨,著一層夾襖步出監(jiān)牢的瞬間若贮,已是汗流浹背省有。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工蠢沿, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留舷蟀,地道東北人面哼。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像魔策,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子虎敦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 單例模式(SingletonPattern)一般被認(rèn)為是最簡單其徙、最易理解的設(shè)計模式喷户,也因為它的簡潔易懂,是項目中最...
    成熱了閱讀 4,231評論 4 34
  • 前言 本文主要參考 那些年,我們一起寫過的“單例模式”避诽。 何為單例模式? 顧名思義睬罗,單例模式就是保證一個類僅有一個...
    tandeneck閱讀 2,488評論 1 8
  • 一:java概述:1古涧,JDK:Java Development Kit羡滑,java的開發(fā)和運行環(huán)境算芯,java的開發(fā)工...
    ZaneInTheSun閱讀 2,635評論 0 11
  • 一.什么是單例模式 單例模式的定義:確保一個類只有一個實例,并提供一個訪問他的全局訪問點职祷。單例模式是幾個設(shè)計模式中...
    Geeks_Liu閱讀 2,216評論 0 10
  • 陽光明媚有梆,春風(fēng)嫵媚意系,綠樹成蔭,鳥鳴歡快......這無時不刻都在贊美春天栩栩如生的春意蛔添,它真的比畫里的春天美多啦作郭。...
    遲暮光之城閱讀 287評論 0 0