【設計模式】之單例模式

做爲程序員必讀經典《重構 改善既有代碼的設計》《effective java》兩本書,對於提高本身代碼的優雅程度確實是很是有幫助。這段事件在學習設計模式,看了《大話設計模式》,雖然這是一本很受非議的一本書,可是每一件事情都是小馬過河,不親自試試怎麼知道不適合本身呢。java

看過大話設計模式以後,感受有那麼一絲明悟,對於面向對象的理解彷佛有那麼更近一層的理解,在寫優質的代碼方面,頗有幫助。程序員

進入正題,單例模式。設計模式

 

有些對象只須要一個,如:配置文件、工具類、線程池、緩存、日誌對象等
多個程序讀取一個配置文件,實際上配置文件仍是隻有一個,若是創造出多個實例,就會致使不少問題,佔用資源過多,不一致的結果等
單例對象(Singleton)是一種經常使用的設計模式。在Java應用中,單例對象能保證在一個JVM中,該對象只有一個實例存在。這樣的模式有幾個好處:
一、某些類建立比較頻繁,對於一些大型的對象,這是一筆很大的系統開銷。 
二、省去了new操做符,下降了系統內存的使用頻率,減輕GC壓力。
三、有些類如交易所的核心交易引擎,控制着交易流程,若是該類能夠建立多個的話,系統徹底亂了。(好比一個軍隊出現了多個司令員同時指揮,確定會亂成一團),因此只有使用單例模式,才能保證核心交易服務器獨立控制整個流程。緩存

 

單例模式分類:安全

一、餓漢模式 加載類時建立實例,所以加載類比較慢,運行時獲取實例比較快,且是線程安全的
二、懶漢模式 不在類加載時建立,獲取時才建立實例,因此類加載時比較快而獲取實例是比較慢,且是線程不安全服務器

注:餓漢和懶漢名稱上能夠從這樣區別:能夠從建立實例的角度來考慮,餓漢式可能太餓了,先把實例建立好,
而懶漢式你要實例的時候我再給你建立,因此就慢了。
 
餓漢式實例:
//餓漢式
class Fruit{
	
	public static Fruit fruit = new Fruit();
	
	private Fruit(){
		
	}
	
	public static Fruit getInstance(){
		return fruit;
	}
}
	public static void main(String[] args) {
		//餓漢式
		Fruit f1 = Fruit.getInstance();
		Fruit f2 = Fruit.getInstance();
		System.out.println(f1);
		System.out.println(f2);	
	}

懶漢式實例:
在該懶漢式中若是是單線程的話,能夠保證建立一個實例,可是若是多線程的或就不必定了
懶漢式在多線程中的實例:
能夠在全局方法上咱們能夠加上同步Sychronized關鍵字。
可是仍是有問題,由於好比來了兩個線程都到了if判斷那裏面,而後到達同步那時,只能進入一個,而後呢第一個線程進去以後new了一個對象,走了,第二個開始進入也是建立了一個對象,那麼問題就出現了兩個對象,因此還需改進,那麼就在同步裏面再加一個判斷,那就是雙重檢查
public class Person {
	
	public static Person person;
	
	 //定義私有的構造函數,防止外部進行建立對象
	private Person(){
	}
	
	public static Person getInstance(){
		if(person == null){
			synchronized(Person.class){
				if(person == null){//雙重檢查
					person = new Person();
				}
			}
		}
		return person;
	}
}
public static void main(String[] args) {

		//懶漢式
		Person p1 = Person.getInstance();
		Person p2 = Person.getInstance();
		System.out.println(p1);
		System.out.println(p2);

		
		
	}


本貼知識點由大兵哥給個人資料整理而成,發到csdn只是想在作一遍複習和養成寫博客的習慣,致謝大兵哥~,大兵哥在平時的學習中給過我不少幫助和學習經驗以及筆記。
原文發佈在csdn http://blog.csdn.net/liu10010/article/details/71703489
相關文章
相關標籤/搜索