国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 中牟县| 册亨县| 贵州省| 普兰县| 博客| 宿州市| 永善县| 涞水县| 邵武市| 北海市| 宜黄县| 古蔺县| 肥乡县| 沧州市| 抚州市| 怀集县| 延津县| 晋中市| 西城区| 紫金县| 绩溪县| 同德县| 禹州市| 云林县| 平山县| 建湖县| 宜川县| 琼中| 增城市| 通渭县| 富蕴县| 桐庐县| 肃宁县| 乌苏市| 改则县| 长宁区| 合江县| 靖州| 页游| 舟山市| 新巴尔虎左旗|