導航:首頁 > 編程語言 > java設計模式單例模式

java設計模式單例模式

發布時間:2023-04-01 00:13:33

java開發在什麼情況下使用單例模式

使用原則如下:

1.單例模式:確保一個類只有一個實例,自行實例化並向系統提供這個實例

2.單例模式分類:餓單例模式(類載入時實例化一個對象給自己的引用),懶單例模式(調用取得實例的方法如getInstance時才會實例化對象)(java中餓單例模式性能優於懶單例模式,c++中一般使用懶單例模式)

⑵ 研磨設計模式之單例模式(內部類)

在Java的單例模式裡面,很多人都知道懶漢式要比餓漢式更優雅,這里我想告訴你的是,我這里,有一種更優雅的單例設計模式。

1、什麼是類級內部類? 簡單點說,類級內部類指的是,有static修飾的成員內部類。如果沒有static修飾的成員式內 * 部類被稱為對象級內部類。
2、類級內部類相當於其外部類的static成分,它的對象與外部類對象間不存在依賴關系正仿,因此 * 可以直接創建。而對象級內部類的實例,是綁定在外部對象實例中的。
3、類級內部類中,可以定義靜態的方法。在靜態方法中只能引用外部類中的靜態成員方法或變數。
4、類級內部類相當於其外部類的成員,只有在第一次被使用的時候才會被裝載。

大家都知道,在多線程開發中,為了解決並發問題,主要是通過使用synchronized來加互斥鎖進行同步控制, 但是在某些情況下,JVM已經隱舉拆纖含的為您執行了同步,這些情況下就不用自己再來進行同步控制了。

1、由靜態初始化器(在靜態欄位上或static{}塊中的初始化器)初始化數據時
2、訪問final欄位時
3、在創建線程之前創建對象時
4、線程可以看見它將要處理的對象時

要想很簡單的實現線程安全,可以採用靜態初始化器的方式,它可以由JVM來保證線程的 安全性。比如前面的餓漢式實現方式。但是這樣一來,不是會浪費一定的空間嗎?因為這種 實現方式,會在類裝載的時候就初始化對象,不管你需不需要。 如果現在有一種方法能夠讓類裝載的時候不去初始化對象,那不就解決御桐問題了?一種可行的方式就是採用類級內部類,在這個類級內部類裡面去創建對象實例。這樣一來,只要不使用到這個類級內部類, 那就不會創建對象實例,從而同步實現延遲載入和線程安全。

⑶ 設計模式之單例模式

單例設計模式理解起來非常簡單。一個類只允許創建一個對象(或者實例),那這個類就是一個單例類,這種設計模式就叫單例模式。

下面的示例中如果每個類都創建一個 Logger 實例,就可能造成日誌內容被覆蓋的情況。

如果有些數據在系統中只應保存一份,那就比較適合設計為單例類。比如悄伍,配置信息類,全局 ID 生成器等。

要實現一個單例,我們要考慮以下幾點:

懶漢式相對於餓漢式的優勢是 「支持延遲載入」 。但缺點也很明顯,因為使用了 synchronized 關鍵字導致這個方法的 「並發度很低」 。如果這個單例類偶爾會被用到,那這種實現方式還可以接受。但是,如果頻繁地用到,就會導致性能瓶頸,這種實現方式就不可取了。

這是一種既支持延遲載入、又支持高並發的單例實現方式。

在 java1.5 以下 instance = new Singleton(); 有指令重排問題,需要給 instance 成員變數加上 volatile 關鍵字,java1.5 之後不會再這個問題。

這種方式利用了 Java 的靜態內渣知部類,有點類似餓漢式,但又能做到了延遲載入。

當外部類 Singleton 被載入的時候,並不會創建 SingletonHolder 實例對象。只有當調用 getInstance() 方法時,SingletonHolder 才會被載入,這個時候才會創建 instance。insance 的唯一性、創建過程的線程安全性,都由 JVM 來保證。所以,這種實現方法既保證了線程安全,又能做到延遲載入。

這是一種最簡單的實現方式,基於枚舉類型的單例實現。這種實現方式是通過 Java 枚舉類型本身的特性,保證了實例創建的線程安全性和實例的唯一性。

上面的單例類對象是進程唯一的,一個進程只能有一個單例對象。那如何實現一個線程唯一的單例呢?

假設 IdGenerator 是一個線程唯一的單例類。在線程 A 內,我們可以創建一啟梁或個單例對象 a。因為線程內唯一,在線程 A 內就不能再創建新的 IdGenerator 對象了,而線程間可以不唯一,所以,在另外一個線程 B 內,我們還可以重新創建一個新的單例對象 b。

我們通過一個 ConcurrentHashMap 來存儲對象,其中 key 是線程 ID,value 是對象。這樣我們就可以做到,不同的線程對應不同的對象,同一個線程只能對應一個對象。實際上,Java 語言本身提供了 ThreadLocal 工具類,可以更加輕松地實現線程唯一單例。

⑷ java常用的的設計模式和開發模式都有哪些

設計模式主要分三個類型、創建型、結構型和行為型。設計模式分:3種類型及23種模式。

JAVA中的開發模式:MVC是一個很常用的程序開發設計模式,M-Model(模型):封裝應用程序的狀態;V-View(視圖):表示用戶界面;C-Controller(控制器):對耐巧用戶的輸入作出反應,創建並設置模型。

(4)java設計模式單例模式擴展閱讀

創建型模式:單例模式、抽象工廠模式、建造者模式、工廠模式、原型模式。

結構型模式:適配器模式、橋接模式、裝飾模式、組合模式、外觀模式、享元模式、代理模式。

行為型模式:模版方法模式、命令模式、迭代器模式、觀察者模式、中介者模式、備告畝笑忘錄模式、解釋器模式(Interpreter模式)、狀態模式、策略模式襪含、職責鏈模式(責任鏈模式)、訪問者模式。

⑸ 如何寫一個標準的Java單例模式

java中單例模式是一種常見的設計模式,單例模式分三種:懶漢式單例、餓漢式單例、登記式單例三種。
單例模式有一下特點:
1、單例類只能有一個實例。
2、單例類必須自己自己創建自己的唯一實例。
3、單例類必須給所有其他對象提供這一實例。
單例模式確保某個類只有一個實例,而且自行實例化並向整個系統提供這個實例。在計算機系統中,線程池、緩存、日誌對象、對話框、列印機、顯卡的驅動程序對象常被設計成單例。這些應用都或多或少具有資源管理器的功能。每台計算機可以有若干個列印機,但只能有一個Printer Spooler,以避免兩個列印作業同時輸出到列印機中。每台計算機可以有若干通信埠,系統應當集中管理這些通信埠,以避免一個通信埠同時被兩個請求同時調用。總之,選擇單例模式就是為了避免不一致狀態,避免政出多頭。
首先看一個經典的單例實現。
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通過將構造方法限定為private避免了類在外部被實例化,在同一個虛擬機范圍內,Singleton的唯一實例只能通過getInstance()方法訪問。(事實上,通過Java反射機制是能夠實例化構造方法為private的類的,那基本上會使所有的Java單例實現失效。此問題在此處不做討論,姑且掩耳盜鈴地認為反射機制不存在。)
但是以上實現沒有考慮線程安全問題。所謂線程安全是指:如果你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結果和單線程運行的結果是一樣的,而且其他的變數的值也和預期的是一樣的,就是線程安全的。或者說:一個類或者程序所提供的介面對於線程來說是原子操作或者多個線程之間的切換不會導致該介面的執行結果存在二義性,也就是說我們不用考慮同步的問題。顯然以上實現並不滿足線程安全的要求,在並發環境下很可能出現多個Singleton實例。

//////////////////////////////////////////////////////////////////////
驗證單例模式的示例
//////////////////////////////////////////////////////////////////////
public class TestStream {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 該類只能有一個實例
private TestStream() {
} // 私有無參構造方法
// 該類必須自行創建
// 有2種方式

private static TestStream ts1 = null;
// 這個類必須自動向整個系統提供這個實例對象
public static TestStream getTest() {
if (ts1 == null) {
ts1 = new TestStream();
}
return ts1;
}
public void getInfo() {
System.out.println("output message " + name);
}
public static void main(String[] args) {
TestStream s = TestStream.getTest();
s.setName("張孝祥 1");
System.out.println(s.getName());
TestStream s1 = TestStream.getTest();
s1.setName("張孝祥 2");
System.out.println(s1.getName());
s.getInfo();
s1.getInfo();
if (s == s1) {
System.out.println("創建的是同一個實例");
} else if (s != s1) {
System.out.println("創建的不是同一個實例");
} else {
System.out.println("application error");
}
}
}
////////////////////////////////////////////

⑹ 什麼是單例設計模式

java模式之單例模式:
單例模式確保一個類只有一個實例,自行提供這個實例並向整個系統提供這個實例。
特點:
1,一個類只能有一個實例
2,自己創建這個實例
3,整個系統都要使用這個實例
例: 在下面的對象圖中,有一個"單例對象",而"客戶甲"、"客戶乙" 和"客戶丙"是單例對象的三個客戶對象。可以燃枝旁看到,所有的客戶皮橡對象共享一個單例對象。而且從單例對象到自身的連接線可以看出,單例對象持搭啟有對自己的引用。

Singleton模式主要作用是保證在Java應用程序中,一個類Class只有一個實例存在。在很多操作中,比如建立目錄 資料庫連接都需要這樣的單線程操作。一些資源管理器常常設計成單例模式。
外部資源:譬如每台計算機可以有若干個列印機,但只能有一個Printer Spooler,以避免兩個列印作業同時輸出到列印機中。每台計算機可以有若干個通信埠,系統應當集中管理這些通信埠,以避免一個通信埠被兩個請求同時調用。內部資源,譬如,大多數的軟體都有一個(甚至多個)屬性文件存放系統配置。這樣的系統應當由一個對象來管理這些屬性文件。

一個例子:Windows 回收站。
在整個視窗系統中,回收站只能有一個實例,整個系統都使用這個惟一的實例,而且回收站自行提供自己的實例。因此,回收站是單例模式的應用。

兩種形式:
1,餓漢式單例類
public class Singleton {

private Singleton(){}

//在自己內部定義自己一個實例,是不是很奇怪?
//注意這是private 只供內部調用

private static Singleton instance = new Singleton();

//這里提供了一個供外部訪問本class的靜態方法,可以直接訪問
public static Singleton getInstance() {
return instance;
}
}

2,懶漢式單例類

public class Singleton {

private static Singleton instance = null;

public static synchronized Singleton getInstance() {

//這個方法比上面有所改進,不用每次都進行生成對象,只是第一次

//使用時生成實例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance; }

}

第二中形式是lazy initialization,也就是說第一次調用時初始Singleton,以後就不用再生成了。

⑺ java中常用的設計模式有哪些

1.單例模式(有的書上說叫單態模式其實都一樣)
該模式主要目的是使內存中保持1個對象
2.工廠模式
該模式主要功能是統一提供實例對象的引用。看下面的例子:
public class Factory{
public ClassesDao getClassesDao(){
ClassesDao cd = new ClassesDaoImpl();
return cd;
}
}
interface ClassesDao{
public String getClassesName();
}
class ClassesDaoImpl implements ClassesDao {
public String getClassesName(){
System.out.println("A班");
}
}
class test
{
public static void main(String[] args){
Factory f = new Factory();
f.getClassesDao().getClassesName();
}
}
這個是最簡單的例子了,就是通過工廠方法通過介面獲取對象的引用
3.建造模式
該模式其實就是說,一個對象的組成可能有很多其他的對象一起組成的,比如說,一個對象的實現非常復雜,有很多的屬性,而這些屬性又是其他對象的引用,可能這些對象的引用又包括很多的對象引用。封裝這些復雜性,就可以使用建造模式。
4.門面模式
這個模式個人感覺像是Service層的一個翻版。比如Dao我們定義了很多持久化方法,我們通過Service層將Dao的原子方法組成業務邏輯,再通過方法向上層提供服務。門面模式道理其實是一樣的。
5.策略模式
這個模式是將行為的抽象,即當有幾個類有相似的方法,將其中通用的部分都提取出來,從而使擴展更容易。

⑻ java中幾種常見的設計模式

一共23種設計模式!

按照目的來分,設計模式可以分為創建型模式、結構型模式和行為型模式。
創建型模式用來處理對象的創建過程;結構型模式用來處理類或者對象的組合;行為型模式用來對類或對象怎樣交互和怎樣分配職責進行描述。

創建型模式用來處理對象的創建過程,主要包含以下5種設計模式:
 工廠方法模式(Factory Method Pattern)
 抽象工廠模式(Abstract Factory Pattern)
 建造者模式(Builder Pattern)
 原型模式(Prototype Pattern)
 單例模式(Singleton Pattern)

結構型模式用來處理類或者對象的組合,主要包含以下7種設計模式:
 適配器模式(Adapter Pattern)
 橋接模式(Bridge Pattern)
 組合模式(Composite Pattern)
 裝飾者模式(Decorator Pattern)
 外觀模式(Facade Pattern)
 享元模式(Flyweight Pattern)
 代理模式(Proxy Pattern)

行為型模式用來對類或對象怎樣交互和怎樣分配職責進行描述,主要包含以下11種設計模式:
 責任鏈模式(Chain of Responsibility Pattern)
 命令模式(Command Pattern)
 解釋器模式(Interpreter Pattern)
 迭代器模式(Iterator Pattern)
 中介者模式(Mediator Pattern)
 備忘錄模式(Memento Pattern)
 觀察者模式(Observer Pattern)
 狀態模式(State Pattern)
 策略模式(Strategy Pattern)
 模板方法模式(Template Method Pattern)
 訪問者模式(Visitor Pattern)

推薦你一本好書:《軟體秘笈:設計模式那點事》,裡面講解的23中設計模式例子很生動,容易理解,還有JDK中設計模式應用情況,看了收獲挺大的!網路裡面搜「設計模式」,第一條中設計模式網路中就有首推該圖書,瀏覽量在20幾萬以上的,不會錯的。好東西大家一起分享!
祝你早日學會設計模式!

⑼ JAVA23種設計模式

一、大約分為三類:

1、創建型模式(5種):工廠方法模式,抽象工廠模式,單例模式,建造者模式,原型模式。

2、結構型模式(7種):適配器模式,裝飾器模式,代理模式,外觀模式,橋接模式,組合模式,享元模式。

3、行為型模式(11種):策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。

二、設計模式遵循的原則有6個:

1、開閉原則(OpenClosePrinciple)

對擴展開放,對修改關閉。

2、里氏代換原則(LiskovSubstitutionPrinciple)

只有當衍生類可以替換掉基類,軟體單位的功能不受到影響時,基類才能真正被復用,而衍生類也能夠在基類的基礎上增加新的行為。

3、依賴倒轉原則(DependenceInversionPrinciple)

這個是開閉原則的基礎,對介面編程,依賴於抽象而不依賴於具體。

4、介面隔離原則(InterfaceSegregationPrinciple)

使用多個隔離的借口來降低耦合度。

5、迪米特法則(最少知道原則)(DemeterPrinciple)

一個實體應當盡量少的與其他實體之間發生相互作用,使得系統功能模塊相對獨立。

6、合成復用原則(CompositeReusePrinciple)

原則是盡量使用合成/聚合的方式,而不是使用繼承。繼承實際上破壞了類的封裝性,超類的方法可能會被子類修改。

閱讀全文

與java設計模式單例模式相關的資料

熱點內容
小說網盤資源 瀏覽:501
全免費影視投屏網站 瀏覽:250
娘娘懷孕快生了忍著不生 瀏覽:804
git拉取代碼的命令 瀏覽:993
程序員節西安市 瀏覽:687
單片機的閃燈 瀏覽:965
phpmime映射 瀏覽:583
關鍵特徵分析python 瀏覽:992
linux粘滯位 瀏覽:137
安卓如何把備忘錄調成黑色 瀏覽:862
dhcp伺服器手動分配ip地址 瀏覽:308
阿里雲國內伺服器數量 瀏覽:455
壓縮機安全裕度 瀏覽:226
android交叉編譯環境 瀏覽:775
美團雲伺服器質量怎麼樣 瀏覽:396
蘋果手機游戲解壓包怎麼安裝 瀏覽:446
java程序員面試流程 瀏覽:681
遼寧圖片加密軟體地址 瀏覽:932
程序員35後應該學些啥技術 瀏覽:724
蘋果怎麼把app還原成ipa包 瀏覽:358