日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java23种模式之单例模式

發布時間:2025/3/16 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java23种模式之单例模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

JAVA23種設計模式四——單例模式

單例模式是一種常用的軟件設計模式,在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統中一個類只有一個實例而且該實例易于外界訪問,從而方便對實例個數的控制并節約系統資源。如果希望在系統中某個類的對象只能存在一個,單例模式是最好的解決方案。

什么是單例模式?

一個類有且僅有一個實例,并且自行實例化向整個系統提供。

也就是說,在整個程序空間中,該類只存在一個實例對象。

GoF對單例模式的定義:

保證一個類,只有一個實例存在,同時提供能對該實例加以訪問的全局訪問方法。

為什么要使用單例模式?

對于系統中的某些類來說,只有一個實例很重要。比如:一個系統中可以存在多個打印任務,但是只能有一個正在工作的任務;一個系統只能有一個窗口管理器或文件系統;一個系統只能有一個計時工具或ID(序號)生成器。在多線程之間,比如servlet環境,共享一個資源或者操作同一個對象,在計算機系統中,線程池、緩存、日志對象、對話框、打印機、顯卡的驅動程序對象常被設計成單例模式。

單例模式的三個要點:

一是某個類只能有一個實例;

二是它必須自行創建這個實例;

三是它必須自行向整個系統提供這個實例。

具體一點就是:

一是單例模式的類只提供私有的構造函數;

二是類定義中含有一個該類的靜態私有對象;

三是該類提供了一個靜態的共有的函數用于創建或獲取它本身的靜態私有對象。

一般Singleton模式通常有三種形式:

第一種:餓漢式

// MainClass.java public class MainClass {public static void main(String[] args){Person per=Person.getPerson();Person per2=Person.getPerson();per.setName("張三");per2.setName("李四");System.out.println(per.getName());System.out.println(per2.getName());} } // Person.java public class Person {public static final Person person=new Person();// 保證該類里只有一個實例private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}// 構造函數私有化private Person(){}// 提供一個全局的靜態方法public static Person getPerson(){return person;} }

第二種:懶漢式

// MainClass.java public class MainClass {public static void main(String[] args){Person2 per=Person2.getPerson();Person2 per2=Person2.getPerson();per.setName("張三");per2.setName("李四");System.out.println(per.getName());System.out.println(per2.getName());} } // Person2.java public class Person2 {// 保證該類里只有一個實例private String name;// 聲明一個靜態的personprivate static Person2 person;public String getName() {return name;}public void setName(String name) {this.name = name;}// 構造函數私有化private Person2(){}// 提供一個全局的靜態方法public static Person2 getPerson(){// 在這里需要加一個判斷,否則在主方法里會產生兩個不同的對象if(person==null){person=new Person2();}return person;} }結果還是:李四

? ? ? ? ? ? ? ? ? 李四


在上面Person2.java代碼中,適用于單線程的情況,不適用多線程,要想適用多線程,需將相應代碼修改為:

// 提供一個全局的靜態方法,使用同步方法public static synchronized Person2 getPerson(){// 在這里需要加一個判斷,否則在主方法里會產生兩個不同的對象if(person==null){person=new Person2();}return person;}這種做法又致使效率大大降低,因為每次獲取對象時,都要進行同步!

第三種:雙重檢查

// MainClass.java public class MainClass {public static void main(String[] args){Person3 per=Person3.getPerson();Person3 per2=Person3.getPerson();per.setName("張三");per2.setName("李四");System.out.println(per.getName());System.out.println(per2.getName());} } // Person3.java public class Person3 {// 保證該類里只有一個實例private String name;// 聲明一個靜態的personprivate static Person3 person;public String getName() {return name;}public void setName(String name) {this.name = name;}// 構造函數私有化private Person3(){}// 提供一個全局的靜態方法public static Person3 getPerson(){// 雙重檢查,效率大大提高if(person==null){synchronized (Person3.class){if(person==null){person=new Person3();}}}return person;} }

這種模式大大提高了執行效率,不必每次獲取對象時都進行同步,只是第一次需要進行同步。

總結

以上是生活随笔為你收集整理的java23种模式之单例模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。