<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    午后星期午

    Java 單例模式詳解

    概念:
      java中單例模式是一種常見(jiàn)的設(shè)計(jì)模式,單例模式分三種:懶漢式單例、餓漢式單例、登記式單例三種。
      單例模式有一下特點(diǎn):
      1、單例類只能有一個(gè)實(shí)例。
      2、單例類必須自己自己創(chuàng)建自己的唯一實(shí)例。
      3、單例類必須給所有其他對(duì)象提供這一實(shí)例。
      單例模式確保某個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。在計(jì)算機(jī)系統(tǒng)中,線程池、緩存、日志對(duì)象、對(duì)話框、打印機(jī)、顯卡的驅(qū)動(dòng)程序?qū)ο蟪1辉O(shè)計(jì)成單例。這些應(yīng)用都或多或少具有資源管理器的功能。每臺(tái)計(jì)算機(jī)可以有若干個(gè)打印機(jī),但只能有一個(gè)Printer Spooler,以避免兩個(gè)打印作業(yè)同時(shí)輸出到打印機(jī)中。每臺(tái)計(jì)算機(jī)可以有若干通信端口,系統(tǒng)應(yīng)當(dāng)集中管理這些通信端口,以避免一個(gè)通信端口同時(shí)被兩個(gè)請(qǐng)求同時(shí)調(diào)用??傊?,選擇單例模式就是為了避免不一致?tīng)顟B(tài),避免政出多頭。

    首先看一個(gè)經(jīng)典的單例實(shí)現(xiàn)。

    public class Singleton {

        private static Singleton uniqueInstance = null;

     

        private Singleton() {

           // Exists only to defeat instantiation.

        }

     

        public static Singleton getInstance() {

           if (uniqueInstance == null) {

               uniqueInstance = new Singleton();

           }

           return uniqueInstance;

        }

        // Other methods...

    }

    Singleton通過(guò)將構(gòu)造方法限定為private避免了類在外部被實(shí)例化,在同一個(gè)虛擬機(jī)范圍內(nèi),Singleton的唯一實(shí)例只能通過(guò)getInstance()方法訪問(wèn)。(事實(shí)上,通過(guò)Java反射機(jī)制是能夠?qū)嵗瘶?gòu)造方法為private的類的,那基本上會(huì)使所有的Java單例實(shí)現(xiàn)失效。此問(wèn)題在此處不做討論,姑且掩耳盜鈴地認(rèn)為反射機(jī)制不存在。)

    但是以上實(shí)現(xiàn)沒(méi)有考慮線程安全問(wèn)題。所謂線程安全是指:如果你的代碼所在的進(jìn)程中有多個(gè)線程在同時(shí)運(yùn)行,而這些線程可能會(huì)同時(shí)運(yùn)行這段代碼。如果每次運(yùn)行結(jié)果和單線程運(yùn)行的結(jié)果是一樣的,而且其他的變量的值也和預(yù)期的是一樣的,就是線程安全的?;蛘哒f(shuō):一個(gè)類或者程序所提供的接口對(duì)于線程來(lái)說(shuō)是原子操作或者多個(gè)線程之間的切換不會(huì)導(dǎo)致該接口的執(zhí)行結(jié)果存在二義性,也就是說(shuō)我們不用考慮同步的問(wèn)題。顯然以上實(shí)現(xiàn)并不滿足線程安全的要求,在并發(fā)環(huán)境下很可能出現(xiàn)多個(gè)Singleton實(shí)例。

    復(fù)制代碼
     1 public class TestStream {
    2 private String name;
    3 public String getName() {
    4 return name;
    5 }
    6 public void setName(String name) {
    7 this.name = name;
    8 }
    9 //該類只能有一個(gè)實(shí)例
    10 private TestStream(){} //私有無(wú)參構(gòu)造方法
    11 //該類必須自行創(chuàng)建
    12 //有2種方式
    13 /*private static final TestStream ts=new TestStream();*/
    14 private static TestStream ts1=null;
    15 //這個(gè)類必須自動(dòng)向整個(gè)系統(tǒng)提供這個(gè)實(shí)例對(duì)象
    16 public static TestStream getTest(){
    17 if(ts1==null){
    18 ts1=new TestStream();
    19 }
    20 return ts1;
    21 }
    22 public void getInfo(){
    23 System.out.println("output message "+name);
    24 }
    25 }
    復(fù)制代碼
    復(fù)制代碼
     1 public class TestMain {
    2 public static void main(String [] args){
    3 TestStream s=TestStream.getTest();
    4 s.setName("張孝祥");
    5 System.out.println(s.getName());
    6 TestStream s1=TestStream.getTest();
    7 s1.setName("張孝祥");
    8 System.out.println(s1.getName());
    9 s.getInfo();
    10 s1.getInfo();
    11 if(s==s1){
    12 System.out.println("創(chuàng)建的是同一個(gè)實(shí)例");
    13 }else if(s!=s1){
    14 System.out.println("創(chuàng)建的不是同一個(gè)實(shí)例");
    15 }else{
    16 System.out.println("application error");
    17 }
    18 }
    19 }
    復(fù)制代碼

    運(yùn)行結(jié)果:
      張孝祥
      張孝祥
      output message 張孝祥
      output message 張孝祥
      創(chuàng)建的是同一個(gè)實(shí)例

    結(jié)論:由結(jié)果可以得知單例模式為一個(gè)面向?qū)ο蟮膽?yīng)用程序提供了對(duì)象惟一的訪問(wèn)點(diǎn),不管它實(shí)現(xiàn)何種功能,整個(gè)應(yīng)用程序都會(huì)同享一個(gè)實(shí)例對(duì)象。

    1.餓漢式單例類

    復(fù)制代碼
     1 //餓漢式單例類.在類初始化時(shí),已經(jīng)自行實(shí)例化 
    2 public class Singleton1 {
    3 //私有的默認(rèn)構(gòu)造子
    4 private Singleton1() {}
    5 //已經(jīng)自行實(shí)例化
    6 private static final Singleton1 single = new Singleton1();
    7 //靜態(tài)工廠方法
    8 public static Singleton1 getInstance() {
    9 return single;
    10 }
    11 }
    復(fù)制代碼

    2.懶漢式單例類

    復(fù)制代碼
     1 //懶漢式單例類.在第一次調(diào)用的時(shí)候?qū)嵗?
    2 public class Singleton2 {
    3 //私有的默認(rèn)構(gòu)造子
    4 private Singleton2() {}
    5 //注意,這里沒(méi)有final
    6 private static Singleton2 single=null;
    7 //靜態(tài)工廠方法
    8 public synchronized static Singleton2 getInstance() {
    9 if (single == null) {
    10 single = new Singleton2();
    11 }
    12 return single;
    13 }
    14 }
    復(fù)制代碼

    3.登記式單例類

    復(fù)制代碼
     1 import java.util.HashMap;
    2 import java.util.Map;
    3 //登記式單例類.
    4 //類似Spring里面的方法,將類名注冊(cè),下次從里面直接獲取。
    5 public class Singleton3 {
    6 private static Map<String,Singleton3> map = new HashMap<String,Singleton3>();
    7 static{
    8 Singleton3 single = new Singleton3();
    9 map.put(single.getClass().getName(), single);
    10 }
    11 //保護(hù)的默認(rèn)構(gòu)造子
    12 protected Singleton3(){}
    13 //靜態(tài)工廠方法,返還此類惟一的實(shí)例
    14 public static Singleton3 getInstance(String name) {
    15 if(name == null) {
    16 name = Singleton3.class.getName();
    17 System.out.println("name == null"+"--->name="+name);
    18 }
    19 if(map.get(name) == null) {
    20 try {
    21 map.put(name, (Singleton3) Class.forName(name).newInstance());
    22 } catch (InstantiationException e) {
    23 e.printStackTrace();
    24 } catch (IllegalAccessException e) {
    25 e.printStackTrace();
    26 } catch (ClassNotFoundException e) {
    27 e.printStackTrace();
    28 }
    29 }
    30 return map.get(name);
    31 }
    32 //一個(gè)示意性的商業(yè)方法
    33 public String about() {
    34 return "Hello, I am RegSingleton.";
    35 }
    36 public static void main(String[] args) {
    37 Singleton3 single3 = Singleton3.getInstance(null);
    38 System.out.println(single3.about());
    39 }
    40 }
    復(fù)制代碼


    posted on 2014-03-27 01:20 午后星期午 閱讀(91) 評(píng)論(0)  編輯  收藏 所屬分類: Java

    主站蜘蛛池模板: 亚洲永久中文字幕在线| 成年女人喷潮毛片免费播放| j8又粗又长又硬又爽免费视频 | 四虎影视成人永久免费观看视频 | 亚洲无线电影官网| 国产亚洲视频在线播放| 亚洲男女内射在线播放| 国产成人精品日本亚洲专区| 国产精品无码一二区免费| 四虎影视免费在线| 国产精品另类激情久久久免费| 国产性生交xxxxx免费| 免费日本黄色网址| 亚洲精品无码日韩国产不卡?V| 亚洲精品久久久www| 亚洲欧洲精品无码AV| 亚洲成A人片在线观看无码不卡| 国产av天堂亚洲国产av天堂| 在线免费观看亚洲| 亚洲专区一路线二| 亚洲欧洲无码AV不卡在线| 丰满亚洲大尺度无码无码专线| 美女裸免费观看网站| eeuss影院免费92242部| 永久免费不卡在线观看黄网站| 中文字幕久精品免费视频| 69视频免费观看l| 亚洲成在人线aⅴ免费毛片| 男女啪啪永久免费观看网站| 国产人成免费视频| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 99久久婷婷国产综合亚洲| 亚洲爆乳少妇无码激情| 色多多A级毛片免费看| 国内精品免费在线观看| 四虎在线最新永久免费| 精品久久久久久久免费人妻| 亚洲精品综合久久| 久久夜色精品国产噜噜亚洲AV| 亚洲xxxx视频| 国产99久久久国产精免费 |