1. 程式人生 > >設計模式之建立型模式(1)--單例模式

設計模式之建立型模式(1)--單例模式

建立類模式主要關注物件的建立過程,將物件的建立過程進行封裝,使客戶端可以直接獲得物件,而不用關心如何建立物件。建立類模式主要有5中:
1.單例模式:用於得到記憶體中唯一的物件。
2.工廠方法模式:用於建立複雜物件。
3.抽象工廠模式:用於建立一組相關或者相互依賴的複雜物件。
4.建造者模式:用於建立模組化的更加複雜的物件。
5.原型模式:用於得到一個物件的拷貝。

這篇部落格主要是對單例模式的複習整理,大家肯定都有接觸過,應該是比較常見的一種設計模式,當然也是最簡單的一種設計模式了!我是做android的所以呢,會多注意一些單例模式在android中的使用!

定義:確保一個類只有一個例項,而且自行例項化並向整個系統提供這個例項!

在android中使用單例模式的時候需要十分的注意記憶體洩露的問題!按我自己的理解記憶體洩露主要的一個原因就是持有物件的引用,而導致的GC無法回收的問題!

舉個例子吧!如果單例模式中用到Context,傳入某個Activity的對應的Context和Application的Context是由很大的區別的,由於單例模式一旦例項化,它在記憶體中存在的週期跟我們的應用的生命週期一樣,所以當你傳入Activity的context時,那麼,這個Activity在關閉後是不會被系統的GC回收的,很明顯就造成的記憶體洩露了!

單例模式根據例項化物件的時機不同可以分為兩種:一種是餓漢式,一種是懶漢式。餓漢式會在單例類被載入的時候,就例項化一個物件交給自己使用;懶漢式則是在呼叫取得例項方法的時候才會例項化物件。當然,單例模式不止這兩種,還有很多形式,只是這兩種是當前比較流行的方式。

餓漢式:
這裡寫圖片描述

懶漢式:
這裡寫圖片描述

單例模式的優點:
1.在記憶體中只有一個物件,節省記憶體空間;
2.避免重複的建立物件,提供了執行效能;
3.可以全域性訪問;

使用注意事項:
1.只能使用單例類提供的方法得到單例物件,不要使用反射,否則會例項化一個新的物件。
2.多執行緒使用單例共享資源的時候,注意執行緒安全問題。
3.不要做斷開單例物件與類中靜態引用的危險操作。

關於java中單例模式的爭議:
單例模式物件長時間不被使用是否會被jvm垃圾集器收集嗎?

之前寫這篇部落格的時候,查資料看到有不少文章介紹說,長時間不用這個單例模式物件的時候,會被jVM當成垃圾,清理掉!在我個人看來,除非你做斷開單例物件與類中靜態引用的操作,否則JVM是不會回收單例模式的物件的(暫時還未想到程式驗證的方法)。

那同一個JVM有沒有可能會產生多個單例模式物件呢?
嗯,是可以的,你可以使用反射的方式,這樣每次執行的時候會產生新的單例物件。所以單例物件必須慎用反射。

那單例模式是否可以被繼承呢?
前邊也說了,單例模式有多種多樣的寫法實現,但是對於餓漢式和懶漢式的單例模式是不能被繼承的,因為它的建構函式是私有的。但是有些單例模式是可以被繼承的,比如說登記式單例模式。

OK,就扯到這!如有問題歡迎大家留言交流!

每天進步一點點,時間會讓你成為巨人!加油!

參考書籍:
《android設計模式》

相關推薦

設計模式建立模式(1)--模式

建立類模式主要關注物件的建立過程,將物件的建立過程進行封裝,使客戶端可以直接獲得物件,而不用關心如何建立物件。建立類模式主要有5中: 1.單例模式:用於得到記憶體中唯一的物件。 2.工廠方法模式:用於建立複雜物件。 3.抽象工廠模式:用於建立一組相關或者相

設計模式建立(1)——模式

定義:保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點。 三種寫法: (1)懶漢式 public class SingletonLazy { private static SingletonLazy instance = null; private Single

java23種設計模式建立設計模式(5種)

 23種設計模式可以分為三類:建立型模式、結構性設計模式、行為型設計模式。 本文將會從淺至深的講解建立型設計模式。 建立型設計模式有: AbstractFactory ( 抽象工廠 ) FactoryMethod ( 工廠方法 ) Singleton ( 單態模式 ) Builde

設計模式建立(2)——工廠模式

工廠模式的三種變種:簡單工廠模式(也稱靜態工廠模式),工廠方法模式,抽象工廠模式 一,靜態工廠模式 定義:通過專門定義一個工廠類負責建立其他類的例項,被建立的例項具有共同的父類。 三種角色: 工廠角色(SimpleFactory),負責建立所有類的內部邏輯。 抽象產品

設計模式系列1——模式

設計模式是一種被重用的程式碼模式,主要大類分為三種:建立型模式、結構型模式、行為型模式。 單例模式的含義是:對於定義的一個類,在整個應用程式執行期間只有唯一的一個例項物件,這樣的設計模式叫做單例模式,單例模式分為餓漢式和懶漢式兩種。 一、懶漢式 懶漢式的特點是當需要用到此單

C#設計模式(1)——模式

div string lec 代碼 而在 多個 read att 加鎖 一、引言 最近在設計模式的一些內容,主要的參考書籍是《Head First 設計模式》,同時在學習過程中也查看了很多博客園中關於設計模式的一些文章的,在這裏記錄下我的一些學習筆記,一是為了幫助我更深入地

設計模式的C++實現 1.模式

單例模式即實現單例類,即系統中一個類只有一個例項,而且該例項易於外界訪問。這樣方便對例項個數進行控制並節約系統資源。 而單例常用與一些非區域性靜態物件,對於這些物件,程式難以控制,對於這些存在與全域性,且一般持久存在的物件,有時需要按照一定約束或順序來進行初始化,而初始化這

設計模式1--模式

單例模式,利用工廠類只生產一個例項或者有限個例項,比如一個系統中只有一個主機板,一個顯示卡,但是有些系統中也可以存在多個,雙顯示卡,雙顯示器等等。 這些在Singleton Module中都是可以定義的。當然我們也可以使用全域性的變數或者靜態類或者物件去做,但是單例模式的

1.模式餓漢式模式

        package singlethon_eager; import java.io.IOException; import java.io.InputStream; import java.util.Properties; /** * 讀取應用配置檔案(使用餓漢式單例模式) * @aut

.net4.0設計模式(一)使用Lazy的模式

private 延遲 是否 方式 get pub ram creat 程序 延遲加載,亦稱延遲實例化,延遲初始化等, 主要表達的思想是,把對象的創建將會延遲到使用時創建,而不是在對象實例化時創建對象,即用時才加載。這種方式有助於提高於應用程序的性能,避免浪費計算,節省內存的

python路_flask框架_模式及session原理

sql content pytho his pri 我們 main imp dbutil 實例化補充: 一、單例模式 1、單例模式介紹   單例模式(Singleton Pattern)是一種常用的軟件設計模式,該模式的主要目的是確保某一個類只有一個實例存在。當你希望在整

2-1 模式

pub ron 實踐 script 線程 性能 image log 生命 單例模式 一、引入 皇帝與臣子 一個類只能生成一個對象(皇帝),其他所有類對這個對象的依賴都是同一個,體現到代碼上如下: /** * @Author: Zephyr * @Description:

python模式控制成只初始化一次,常規的python模式在新式類和經典類中的區別。

spa alt let __main__ python2 urn 時間 div 分享 單例模式的寫法非常多,但常規型的單例模式就是這樣寫的,各種代碼可能略有差異,但核心就是要搞清楚類屬性 實例屬性,就很容易寫出來,原理完全一模一樣。 如下: 源碼: class

設計模式 _第一招式_模式

一、定義 單例模式(Singleton Pattern)是一個比較簡單的模式,確保某一個類只有一個例項,而且自行例項化並向整個系統提供這個例項。 二、程式碼演示 Singleton 類稱為單例類,通過使用private的建構函式確保在一個應用中只產生一個例項,並且自行例項化,單例

C++設計一個執行緒安全的懶漢模式

#incldue<iostream> #include<mutex> using namespace std; class CSingleton { public: static CSingleton* GetCSingleton() { if (_p ==

劍指offer-1模式

單例模式所實現的就是隻允許這個類生成一個例項 單例模式有兩種,分為懶漢式和餓漢式。   餓漢式呢,就是一旦載入該類,不管有沒有用到該例項,就先創建出該類的一個唯一例項,這個是天生執行緒安全的。 public class Singleton1 { private Singlet

設計模式學習總結(2)模式、建造者模式、原型模式

單例模式(Singleton Pattern) 這種模式涉及到一個單一的類,該類負責建立自己的物件,同時確保只有單個物件被建立。這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不需要例項化該類的物件。 單例模式有以下三點注意: 1、單例類只能有一個例項。 2、單

設計模式學習(五):模式

2018年08月30日 目錄 1、單例模式概念 確保某一個類只有一個例項,並且自行例項化,並且向整個系統提供這個例項。 與全域性變數的區別:全域性變數不能實現繼承,而單例模式可以; 2、餓漢模式 package designModel.Si

Eclipse 建立程式碼模板,模式

使用eclipse寫單例模式時,往往要寫很多相同的程式碼。可以使用模板進行簡化。像在eclipse裡寫syso,會自動補全System.out.println(); eclipse 選單欄依次進入: Window->Preferences->

Head First 設計模式(C++實現):模式:Singleton

單例模式:確保一個類只有一個例項,並提供一個全域性訪問點 1 .經典單例模式實現   我們都很清楚一個簡單的單例模式該怎樣去實現:建構函式宣告為private或protect防止被外部函式例項化,內部儲存一個private static的類指標儲存唯一的例項,例項的動