Java 单列模式(Singleton)
單例模式(Singleton)
定義:保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。
目的:使得類的一個(gè)對(duì)象成為系統(tǒng)中的唯一實(shí)例。
如何保證一個(gè)類只有一個(gè)實(shí)例并且這個(gè)實(shí)例易于被訪問(wèn)呢?
我們都知道,一個(gè)類多次被new 創(chuàng)建后,獲取的是不同實(shí)例。
創(chuàng)建一個(gè)類 public class NewObject {} 測(cè)試 public class NewOne {public static void main(String[] args) {NewObject no1= new NewObject();NewObject no2= new NewObject();System.out.println("no1--->"+no1);System.out.println("no2--->"+no2);} }控制臺(tái)輸出的是:
由此可知:要想產(chǎn)生單個(gè)實(shí)例就得:讓類自身負(fù)責(zé)保存它的唯一實(shí)例,這個(gè)類可以保證沒有其他實(shí)例被創(chuàng)建,并且它可以提供一個(gè)訪問(wèn)該實(shí)例的方法。
-
- 單例模式的類只提供私有的構(gòu)造函數(shù)
- 類定義中含有一個(gè)該類的靜態(tài)私有對(duì)象
- 提供了一個(gè)靜態(tài)的公有的函數(shù)用于創(chuàng)建或獲取它本身的靜態(tài)私有對(duì)象
一般Singleton有是三種模式:懶漢式(最常用)、餓漢式、?雙重鎖
懶漢式:
public class Singleton {/* * 懶漢式單例:只有在第一次請(qǐng)求實(shí)例的時(shí)候創(chuàng)建,并且只在第一次創(chuàng)建后,以后不再創(chuàng)建該類的實(shí)例 */ // 1.一個(gè)私有的指向自己的靜態(tài)變量 private static Singleton instance; // 2.私有的構(gòu)造方法,保證不能從外部創(chuàng)建對(duì)象 private Singleton(){} // 3.公開的靜態(tài)工廠方法,返回該類的唯一實(shí)例(當(dāng)發(fā)現(xiàn)沒有實(shí)例沒有初始化的時(shí)候才初始化) public static Singleton getInstance(){ if(instance == null){ instance = new Singleton(); System.out.println("創(chuàng)建Singleton類的實(shí)例"); }else { System.out.println("實(shí)例已經(jīng)創(chuàng)建,不能再創(chuàng)建"); } return instance; } } public class Test {public static void main(String[] args) { Singleton s = Singleton.getInstance(); System.out.println("第一次---->"+s); System.out.println("第二次---->"+Singleton.getInstance()); System.out.println("第三次---->"+Singleton.getInstance()); } }餓漢式:
public class Singleton2 { /* * 惡漢單例模式:在類加載的時(shí)候就創(chuàng)建一個(gè)單例模式. */ // 1.私有的構(gòu)造函數(shù),確保不能在類的外部訪問(wèn)該類的構(gòu)造函數(shù) private Singleton2(){ System.out.println("構(gòu)造函數(shù)執(zhí)行了"); } // 2.私有的唯一的靜態(tài)實(shí)例變量,在類加載的時(shí)候就創(chuàng)建好單例對(duì)象 private final static Singleton2 instance = new Singleton2(); // 3.公開的靜態(tài)工廠返回此類的唯一實(shí)例 public static Singleton2 getInstance(){ return instance; } } public class Test {public static void main(String[] args) { Singleton2 s1 = Singleton2.getInstance(); System.out.println(s1); System.out.println(Singleton2.getInstance()); System.out.println(Singleton2.getInstance()); } }? ?雙重鎖
?
package com.單列模式;public class Singleton3 {private static Singleton3 instance=null;private Singleton3(){System.out.println("構(gòu)造函數(shù)開始!");}public static synchronized Singleton3 getInstance(){if(instance==null){synchronized(Singleton3.class){if(instance==null){instance=new Singleton3();}}}return instance;} } public class Test {public static void main(String[] args) { Singleton3 s3 =Singleton3.getInstance();System.out.println(s3);System.out.println(Singleton3.getInstance());System.out.println(Singleton3.getInstance());} }?
?
謝謝大家的關(guān)注。小弟才疏學(xué)淺,更新的很慢,但我會(huì)把自己學(xué)的傾囊相授。人生兩大悲劇:一是萬(wàn)念俱灰,一是躊躇滿志。
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/hxb2016/p/6125023.html
總結(jié)
以上是生活随笔為你收集整理的Java 单列模式(Singleton)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Tsung MQTT协议简介及MQTT
- 下一篇: 三星笔记本怎么进入usb启动设置密码 三