国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

C#設(shè)計模式-單實例

2019-11-17 02:44:09
字體:
供稿:網(wǎng)友

C#設(shè)計模式-單實例

單例模式就是保證在整個應(yīng)用程序的生命周期中,在任何時刻,被指定的類只有一個實例,并為客戶程序提供一個獲取該實例的全局訪問點。

1.經(jīng)典的模式

namespace singleClass{    class OnlyOneClass    {        PRivate OnlyOneClass() { }        private static OnlyOneClass instance;        public static OnlyOneClass getInstance() {            if (instance == null) {                    instance = new OnlyOneClass();                    return instance;            }            return instance;        }    }}

分析一下:

1)通過私有化構(gòu)造函數(shù),使該類被調(diào)用的時候不能通過new來實現(xiàn)

2)定義一個靜態(tài)變量類,它的生命周期和程序的生命周期是一樣的,通過該靜態(tài)變量來保存該類的實例

2)通過一個靜態(tài)方法來實例化自己,并返還實例化后的結(jié)果,因為該方法先檢查全局的實例,再判斷是否再創(chuàng)建,保證只有一個實例

但是,這種方式如果碰到了多線程并發(fā),問題就來了,如A,B兩個線程同時訪問了這個類,第一次檢查時候都是null,會出現(xiàn)兩個同時建立自己實例情況,這樣就違背單實例模式的原則

改進一下后:

2.俗稱懶漢模式

namespace singleClass{    class OnlyOneClass    {        private OnlyOneClass() { }        public string thisname;        private static OnlyOneClass instance;        private static object _lock = new object();        public static OnlyOneClass getInstance() {            if (instance == null) {                lock (_lock)                {                    if (instance == null)                    {                        instance = new OnlyOneClass();                        return instance;                    }                }            }            return instance;        }    }}

解析:

1)聲明一個object 變量,作為lock對象

2)先判斷instance的變量是否為null,如果不為null也就不用lock了,直接返回實例

3) 如果是null,鎖定對象,繼續(xù)判斷是否為null,以防有其他線程在lock前已經(jīng)新建了實例,lock后可以保證在一個線程內(nèi)操作

3.餓漢模式

class HungerClass{        private HungerClass() { }        private readonly static HungerClass instance=new HungerClass ();        public static HungerClass getInstance(){            return instance;        }    }
可以看出這種模式是在類初始化后就已經(jīng)實例化了instance,不同于上面的懶漢模式時在調(diào)用getInstance()方法后實例化。
這種方式下,線程安全的問題將交給CLR。

4.測試

演示一下,通過聲明兩個OneClass類,只一個對其的thisname賦值,然后輸出這兩個類的thisname,看看另一個會怎樣
class Program    {                static void Main(string[] args)        {            Console.WriteLine("Get a instanc from OnlyOneClass!");            try {                OnlyOneClass one = OnlyOneClass.getInstance();//one 第一個類的變量                        Console.WriteLine(one.ToString());                                  while(true){                      string ins = Console.ReadLine();                      if (ins != "") { one.thisname = ins; }//只對one實例的thisname賦值                      OnlyOneClass two = OnlyOneClass.getInstance();//two 第二個類的變量                      Console.WriteLine(one.thisname +" one");//輸出 one實例的thisname                      Console.WriteLine(two.thisname +" two"); //輸出 two實例的thisname                      Thread.Sleep(1000);                  }            }            catch (Exception e) {                Console.WriteLine(e.Message);            }                       Console.ReadKey();        }    }}
image
可以看到這兩個實例都來自一個實例。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 绍兴县| 瑞丽市| 兴文县| 诸暨市| 靖西县| 广昌县| 达尔| 山东省| 巨鹿县| 弥勒县| 奈曼旗| 桓台县| 平南县| 靖远县| 鞍山市| 昭平县| 乌拉特后旗| 盐边县| 顺义区| 神木县| 泗水县| 静乐县| 眉山市| 台东县| 黄冈市| 彭泽县| 航空| 青海省| 满洲里市| 江口县| 海晏县| 荣昌县| 徐闻县| 弥渡县| 太谷县| 古浪县| 郸城县| 图木舒克市| 镇雄县| 天津市| 天津市|