1. 程式人生 > >單件模式詳解:懶漢式與餓漢式

單件模式詳解:懶漢式與餓漢式

程式猿始終不夠 2012-04-24 新浪微博:http://weibo.com/ybchrist 廢話少說,先列出程式碼(java)
class Instance{}
//懶漢式
class LSingle{
	private static  Instance _instance = null; 
	private LSingle(){}
	
	public static Instance getInstance(){
		if(_instance==null){
			synchronized(LSingle.class){
				_instance = new Instance();
			}
		}
		return _instance;
	}
}
//餓漢式
class ESingle{
	private static Instance _instance = new Instance();
	
	private ESingle(){}
	
	public static Instance getInstance(){
		return _instance;
	}
}

單件模式用途:
單件模式屬於工廠模式的特例,只是它不需要輸入引數並且始終返回同一物件的引用。
單件模式能夠保證某一型別物件在系統中的唯一性,即某類在系統中只有一個例項。它的用途十分廣泛,打個比方,我們開發了一個簡單的留言板,使用者的每一次留言都要將留言資訊寫入到資料庫中,最直觀的方法是沒次寫入都建立一個數據庫的連結。這是個簡單的方法,在不考慮併發的時候這也是個不錯的選擇。但實際上,一個網站是併發的,並且有可能是存在大量併發操作的。如果我們對每次寫入都建立一個數據庫連線,那麼很容易的系統會出現瓶頸,系統的精力將會很多的放在維護連結上而非直接查詢操作上。這顯然是不可取的。
如果我們能夠保證系統中自始至終只有唯一一個數據庫連線物件,顯然我們會節省很多記憶體開銷和cpu利用率。這就是單件模式的用途。當然單件模式不僅僅只用於這樣的情況。在《設計模式:可複用面向物件軟體的基礎》一書中對單件模式的適用性有如下描述:
1、當類只能有一個例項而且客戶可以從一個眾所周知的訪問點訪問它時。
2、當這個唯一例項應該是通過子類化可擴充套件的,並且客戶應該無需更改程式碼就能使用一個擴充套件的例項時。

關於Instance類應該如何設計:
如上面敘述,我們保證單件模式類是我們取得單件例項的唯一訪問點。那麼我們應該保證在程式中儘量避免允許建立Instance例項。
通過將建構函式宣告為private可以防止程式設計師通過new關鍵字呼叫構造上函式建立物件。並且在Instance類中建立getXXX()方法呼叫建構函式並返回具體Instance例項。具體程式碼如下:

class Instance{
	private Instance(){}
	
	public static Instance getSelf(){
		return new Instance();
	}
}
//懶漢式
class LSingle{
	private static  Instance _instance = null; 
	private LSingle(){}
	
	public static Instance getInstance(){
		if(_instance==null){
			synchronized(LSingle.class){
				_instance = Instance.getSelf();
			}
		}
		return _instance;
	}
}
//餓漢式
class ESingle{
	private static Instance _instance = Instance.getSelf();
	
	private ESingle(){}
	
	public static Instance getInstance(){
		return _instance;
	}
}
下面對單件模式的懶漢式與餓漢式進行簡單介紹:
1、餓漢式:在程式啟動或單件模式類被載入的時候,單件模式例項就已經被建立。
2、懶漢式:當程式第一次訪問單件模式例項時才進行建立。
如何選擇:如果單件模式例項在系統中經常會被用到,餓漢式是一個不錯的選擇。
    反之如果單件模式在系統中會很少用到或者幾乎不會用到,那麼懶漢式是一個不錯的選擇。

相關推薦

單件模式懶漢式

程式猿始終不夠 2012-04-24 新浪微博:http://weibo.com/ybchrist 廢話少說,先列出程式碼(java) class Instance{} //懶漢式 class LSingle{ private static Instance _in

單例模式懶漢式

懶漢式: public class SingleTon{   private static SingleTon singleTon;   private SingleTon(){}   public static SingleTon getSingleTon(){     if(singleTon

C++ 單例模式懶漢式

應該都知道一個單例模式怎樣去實現: 1、建構函式宣告為private或protect防止被外部函式例項化。 2、提供一個全域性的靜態方法(全域性訪問點)。 3、內部儲存一個private static的類指標儲存唯一的例項,例項的動作由一個public的類方法代勞,該方法也

android之單例模式懶漢式的區別

單例模式:懶漢式和餓漢式    餓漢式:執行緒安全:構造方法私有化:推薦使用          public class Singleton{            private static Si

[轉]設計模式--單例模式(一)懶漢式

打印 是否 調用構造 餓漢 一段 tools 會有 輸出結果 java 單例模式是設計模式中比較簡單的一種。適合於一個類只有一個實例的情況,比如窗口管理器,打印緩沖池和文件系統, 它們都是原型的例子。典型的情況是,那些對象的類型被遍及一個軟件系統的不同對象訪問,因此需要一個

單例模式實現方法之懶漢式

項目 只有一個 接下來 程序設計 選擇 bsp 私有 syn 屬性 Singleton 單例模式是一種經常在項目開發中使用的程序設計模式,它用於創建一個全局共享的實例對象。該實例對象在整個應用程序中只有一個,不會出現更多的該實例對象。 實現原理就是將類的構造方法私有化,即使

singleton懶漢式以及執行緒安全(雙檢鎖)

/************************************************************************* > File Name: Singleton.cpp > Created Time: Tue 31 Oct 2017 10:20:

第六章單利模式懶漢式以及靜態內部類,雙重檢查

文章轉自:https://blog.csdn.net/u012453843/article/details/73743997單例模式,最常見的就是飢餓模式和懶漢模式,一個直接例項化物件,一個在呼叫方法時進行例項化物件。       大家見的最多的莫過於下面這種單例模式了,這種

設計模式彙總

二十三個設計模式 模式的四個基本要素: (1)模式名稱(Pattern Name) (2)問題 Problem (3)解決方案Solution (4)效果(Consequences) 1.工廠模式 使用場景:在編碼的時候不能預見需要建立哪種類的例項; 系統不應

scala分別使用懶漢式實現單例模式

# 在java中,單例模式需要滿足以下要求: - 構造方法私有化,使得本類之外的地方不能使用構造方法new出物件 - 提供私有==靜態屬性==,接收單例物件 - 公共的、==靜態的getInstance方法==,便於外界拿到單例物件 想了解Java單例模式的請轉到:[Java單例模式-懶漢式、惡漢式、靜態內

單例模式懶漢式區別

單例模式懶漢式和餓漢式區別 單例模式(Singleton Pattern)是 Java 中最簡單的設計模式之一。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。 這種模式涉及到一個單一的類,該類負責建立自己的物件,同時確保只有單個物件被建立。這個類提供了一種訪問其唯一的物件的方

設計模式之 單例模式懶漢式

設計模式: 一些人總結出來用來解決特定問題的固定的解決方案。 單例模式 解決一個類在記憶體中只存在一個物件,想要保證物件的唯一。 1 為了避免其他程式過多的建立該類物件。禁止其他程式建立該類物件。 2 為了其他程式可以訪問該類物件,在本類中自定義一個物件。 3 方便其他程

單例模式--懶漢式

懶漢模式(類載入時不初始化 public class LazySingleton { //懶漢式單例模式 //比較懶,在類載入時,不建立例項,因此類載入速度快,但執行時獲取物件的速度慢 private static LazySingleton intance = null;//靜態私用成

單例模式懶漢式)及如何實現執行緒安全

單例模式有兩種:懶漢式和餓漢式。 1 #include <iostream> 2 3 using namespace std; 4 5 6 // 保證在整個程式執行期間,最多隻能有一個物件例項 7 8 9 // 懶漢式 10 // 1 、建構函式私有化 11

單例模式懶漢式

單例模式是一個類有且僅有一個例項,並且自行例項化向整個系統提供,常用的有懶漢式和餓漢式。 一、懶漢式:在第一次呼叫的時候才例項化自己。 public class Singleton {

[設計模式]單例模式(懶漢式)

單例模式(Singleton pattern) 定義: 一種常見的軟體設計模式 目的: 應用該模式的類一個類只有一個例項。即一個類只有一個物件例項 瞭解了定義和目的後我們先來看一下兩種單例模式: 1.懶漢式(lazy): 概念: 顧名

C#/.NET 單例模式——懶漢式,三種實現方法

C# 單例模式 ——懶漢式,餓漢式# 註釋: /// 單例模式 /// /// 餓漢式 :第一時間建立例項,類載入就馬上建立 /// 懶漢式 :需要才建立例項,延遲載入 /// /// 單例模式會長期持有一個物件,不會釋放 /// 普通例項使用完後釋放 /// /// 單例

如何正確地寫出單例模式懶漢式寫法)

本文轉自大神:伍翀 原文連結 單例模式算是設計模式中最容易理解,也是最容易手寫程式碼的模式了吧。但是其中的坑卻不少,所以也常作為面試題來考。本文主要對幾種單例寫法的整理,並分析其優缺點。很多都是一些老生常談的問題,但如果你不知道如何建立一個執行緒安全的單例,不知道什

簡單java單例模式 懶漢式以及解決執行緒安全問題(synchronized)

單例模式(又稱設計模式) 一個類只存一個物件(例項)。 單例模式是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統中一個類只有一個例項而且該例項易於外界訪問,從而方便對例項個數額控制並節約系統資源。如果希望在系統中某個類的物件

設計模式之單例模式懶漢式

設計模式第一個模式通常是單例模式,是為了防止某個類存在多個物件。 程式碼如下: **singlon.h:** #pragma once #ifndef _SINGLON_H #define _SINGLON_H class singlon { publ