成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

java設(shè)計(jì)模式中的單例模式簡單介紹-創(chuàng)新互聯(lián)

這篇文章主要介紹“java設(shè)計(jì)模式中的單例模式簡單介紹”,在日常操作中,相信很多人在java設(shè)計(jì)模式中的單例模式簡單介紹問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”java設(shè)計(jì)模式中的單例模式簡單介紹”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

成都創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供文水網(wǎng)站建設(shè)、文水做網(wǎng)站、文水網(wǎng)站設(shè)計(jì)、文水網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、文水企業(yè)網(wǎng)站模板建站服務(wù),10年文水做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

  一、引言

  單例模式是啥?故名思意,就是單著的意思。沒錯(cuò),就是為了來保證整個(gè)系統(tǒng)運(yùn)行中,從頭至尾只有一個(gè)對象。比如說,我們最可愛的學(xué)校,可以有很多學(xué)生,可以有很多主任,但是不能有很多校長。為什么?因?yàn)橐_保只有一個(gè)校長,學(xué)校這個(gè)系統(tǒng)才不會因?yàn)槭芨蓴_崩潰,所以單例模式應(yīng)運(yùn)而生。

  二、實(shí)現(xiàn)方式

  都知道了單例模式是干嘛的了,那就好辦了。首先你要確保整個(gè)系統(tǒng)的laowang類只有老王一個(gè)對象 最重要的前提你要做什么??可想而知,老王不能被其他類所創(chuàng)造出來啊。

  因此有如下做法:

  1. 先把構(gòu)造方法給私有化了(private)。

  2. 接著在程序運(yùn)行的時(shí)候創(chuàng)建一個(gè)對象放在內(nèi)存里就得了。

  你沒看錯(cuò),要實(shí)現(xiàn)單例模式,確確實(shí)實(shí)就只有這兩步,第一步2秒鐘搞定,第二步就是我們要來探討的部分了。

  實(shí)現(xiàn)單例模式有五種做法:

  餓漢式:

  也就是在程序裝載時(shí)提前把對象創(chuàng)建了,有人來就給他。

  懶漢式:

  在有人需要的時(shí)候,再創(chuàng)建第一個(gè)對象,然后再給他。(懶加載)

  雙重檢驗(yàn)方式:

  內(nèi)部類方式:

  枚舉方式:

  提示:在上面實(shí)現(xiàn)方式中只展現(xiàn)線程安全的做法,詳細(xì)的我后面會指出。

  三、具體實(shí)現(xiàn)

  1. 餓漢式

  分為兩步走:

  把構(gòu)造方法私有化

  在程序裝載時(shí)提前創(chuàng)建好實(shí)例

  class Laowang{

  private Laowang(){}//私有化構(gòu)造方法

  private static Laowang laowang=new Laowang();//直接創(chuàng)建靜態(tài)實(shí)例

  //對外提供靜態(tài)方法獲取當(dāng)前的Laowang

  public static Laowang getLaowang(){

  return laowang;

  }

  }

  //Main方法

  public static void main(String[] args) {

  //用Laowang類的靜態(tài)方法getLaowang()獲取實(shí)例;

  Laowang laowang1=Laowang.getLaowang();

  Laowang laowang2=Laowang.getLaowang();

  //判斷l(xiāng)aowang1是否和老王2是同一個(gè)對象(是輸出true,否則false)

  System.out.println(laowang1==laowang2);

  }

  運(yùn)行結(jié)果: true

  上面這個(gè)例子中,在老王這個(gè)類中,先私有化構(gòu)造方法,接著創(chuàng)建一個(gè)靜態(tài)屬性laowang, 然后提供一個(gè)對外的靜態(tài)方法getLaowang()可以給別人拿這個(gè)laowang。(因?yàn)槟阋呀?jīng)把構(gòu)造方法私有化了,所以你只能通過靜態(tài)方法把laowang給別人。)

  Main方法中定義了2個(gè)引用laowang1,laowang2,但是都是通過同一種方式拿到實(shí)例對象laowang.因此拿到的是同一個(gè)對象,所以返回true,這就是餓漢式實(shí)現(xiàn)法。

  優(yōu)點(diǎn):實(shí)現(xiàn)簡單,線程安全。

  缺點(diǎn):很明顯,在類裝載的時(shí)候直接創(chuàng)建,有時(shí)候你不需要它,它也會創(chuàng) 建,造成內(nèi)存資源浪費(fèi)。

  餓漢式也有另外一種寫法,也是一樣的效果。把new Laowang()放在靜態(tài)代碼塊里,如下:

  class Laowang{

  private static Laowang laowang;

  private Laowang(){}//私有化構(gòu)造方法

  static {

  laowang=new Laowang();

  }

  //對外提供靜態(tài)方法獲取當(dāng)前的Laowang

  public static Laowang getLaowang(){

  return laowang;

  }

  }

  2. 懶漢式

  在程序需要用到調(diào)用的時(shí)候才給它(懶加載),因此做法如下:

  class Laowang{

  private static Laowang laowang;

  private Laowang(){}//私有化構(gòu)造方法

  //對外提供靜態(tài)方法,創(chuàng)建實(shí)例然后返回,當(dāng)前的Laowang

  public static synchronized Laowang getLaowang(){

  if (laowang == null) {

  laowang=new Laowang();

  }

  return laowang;

  }

  }

  此做法需要在方法聲明加上synchronized,(具體作用:比如說很多人來訪問這個(gè)方法,他們必須排隊(duì)訪問) 這種怎么理解呢?就是說在別人需要用到laowang,調(diào)用getLaowang()的時(shí)候,先排隊(duì),排到他的時(shí)候,進(jìn)去判斷l(xiāng)aowang是不是為空,是就new一個(gè),不是就拿當(dāng)前l(fā)aowang給他。當(dāng)然main運(yùn)行結(jié)果還是為true這里就不作多的描述。

  優(yōu)點(diǎn): 不會造成內(nèi)存浪費(fèi)

  缺點(diǎn): 很明顯,人人平等,大家都要排隊(duì),既然排隊(duì)就慢,高并發(fā)情況下,極度影響效率。

  在這里解釋為什么要加同步鎖:如果不加的話,舉個(gè)例子,程序運(yùn)行剛開始,小黑和小紅同時(shí)訪問這個(gè)方法,同時(shí)作判斷,肯定同時(shí)都判斷為空,而且兩個(gè)人都進(jìn)去了,new Laowang();很明顯直接造成laowang不是單例的了。因此要加鎖。 小黑小紅都要排隊(duì)。

  3. 雙重檢驗(yàn)鎖

  也是屬于懶加載

  class Laowang{鄭州哪個(gè)人流醫(yī)院好 http://www.csyhjlyy.com/

  private volatile static Laowang laowang;//必須加上volatile 關(guān)鍵字

  private Laowang(){}//私有化構(gòu)造方法

  //對外提供靜態(tài)方法,創(chuàng)建實(shí)例然后返回,當(dāng)前的Laowang

  public static Laowang getLaowang(){

  if (laowang == null) {

  synchronized (Laowang.class){ //同步代碼(照樣要排隊(duì))

  if (laowang==null){

  laowang=new Laowang();

  }

  }

  }

  return laowang;

  }

  }

  分析一下代碼哈,首先靜態(tài)屬性laowang要加上volatile (具體作用要詳細(xì)了解的話建議百度搜一下哈,屬于多線程內(nèi)容的一部分)。然后再getLaowang()方法中,先判斷l(xiāng)aowang是否為空,如果為空,請排隊(duì)。排完隊(duì)后,再次判斷,如果還是為空,才new一個(gè)返回。

  舉個(gè)例子解釋一下為什么要這樣做:

  還是小黑小紅,同時(shí)并發(fā)進(jìn)來訪問,然后肯定同時(shí)第一次判斷都為空,接著兩個(gè)人排隊(duì),小黑先進(jìn)去玩會,肯定第二次判斷為空,結(jié)果肯定是小黑new了一個(gè)laowang走了。排到小紅了,小紅進(jìn)來第二次判斷發(fā)現(xiàn)laowang不為空了,直接帶走。

  溫馨提示:再看一邊再繼續(xù)看下面內(nèi)容

  這個(gè)時(shí)候有人問了,那為什么要第一次判斷干嘛,直接排隊(duì)他不香嗎?沒錯(cuò),我第一次也這不理解的地方。我們腦回路回退到小黑剛new完laowang走了。剛要排到小紅了。突然來了個(gè)第三者小三,如果你沒有第一次判斷,小三還要繼續(xù)排在小紅后面,造成效率降低。但是現(xiàn)在小三第一次判斷發(fā)現(xiàn)laowang已經(jīng)不為空了(此時(shí)laowang是第一個(gè)人小黑弄出來的),直接帶走。

  優(yōu)點(diǎn): 解決了排隊(duì)效率降低的問題,線程安全。

  缺點(diǎn): 實(shí)現(xiàn)較為復(fù)雜。

  4. 內(nèi)部類方式

  也是屬于懶加載,故名思意,首先整個(gè)內(nèi)部類出來,代碼如下:

  兄臺要看如下代碼,請先了解final關(guān)鍵字的作用

  這里對final作簡單描述:

  對類使用:表示該類不能被繼承(俗稱斷子絕孫類)

  對方法使用:表示該方法不能被重寫

  對基礎(chǔ)類型使用:比如說int,float…表示該值不可以被更改

  對引用對象使用:表示該引用從頭到尾只指向一個(gè)對象

  以上3.對基礎(chǔ)類型使用,4.對引用對象使用都必須直接賦值。

  class Laowang{

  private Laowang(){} //私有化構(gòu)造方法

  //對外提供靜態(tài)方法,調(diào)用內(nèi)部類的屬性,返回

  public static final Laowang getLaowang(){

  return laowangHolder.INSTANCE;

  }

  //靜態(tài)內(nèi)部類

  private static final class LaowangHolder{

  private static final Laowang INSTANCE =new Laowang();

  }

  }

  解釋以上代碼:首先聲明了一個(gè)內(nèi)部類(LaowangHolder),他有個(gè)靜態(tài)且被final修飾的屬性INSTANCE,因此需要直接賦值,new Laowang();接著在getLaowang()方法中調(diào)用內(nèi)部類的INSTANCE屬性,返回。因?yàn)镮NSTANCE被final修飾,只指向同一個(gè)laowang,所以他是單例的。

  5. 枚舉方式

  這些方法實(shí)現(xiàn)相對簡單,所以直接上代碼:

  enum Laowang{

  laowang;

  public void whateverMethod(){}

  }

  //Main方法:

  public static void main(String[] args) {

  //直接當(dāng)成屬性調(diào)用就可以了

  Laowang laowang1=Laowang.laowang;

  Laowang laowang2=Laowang.laowang;

  System.out.println(laowang1==laowang2);

  }

  直接聲明一個(gè)枚舉類,定義一個(gè)屬性,main方法中直接獲取即可。

到此,關(guān)于“java設(shè)計(jì)模式中的單例模式簡單介紹”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

文章標(biāo)題:java設(shè)計(jì)模式中的單例模式簡單介紹-創(chuàng)新互聯(lián)
新聞來源:http://jinyejixie.com/article16/deddgg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、手機(jī)網(wǎng)站建設(shè)靜態(tài)網(wǎng)站、域名注冊網(wǎng)站設(shè)計(jì)公司、網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)
阳春市| 财经| 广元市| 肃宁县| 会宁县| 同德县| 永福县| 榆林市| 盱眙县| 宁乡县| 潼南县| 台东市| 石狮市| 蕉岭县| 临高县| 小金县| 九寨沟县| 湾仔区| 东台市| 开原市| 新竹市| 博客| 墨竹工卡县| 太仓市| 新绛县| 洛扎县| 昌吉市| 石首市| 永和县| 桃园市| 台安县| 嘉义县| 清流县| 迭部县| 武乡县| 灌阳县| 曲靖市| 陇南市| 铁岭县| 乡宁县| 阿荣旗|