設計模式之單例模式

2021-10-05 02:38:20 字數 2755 閱讀 3890

單例模式是指確保乙個類在任何情況下都絕對只有乙個例項,並提供乙個全域性訪問點。單例模式是建立型模式。

餓漢式單例

建立餓漢式單例的**示例
public

class

hungrysingleton

public

static hungrysingleton getinstance()

}

還有一種寫法,利用靜態**塊的機制

public

class

hungrystaticsingleton

private

hungrystaticsingleton()

public

static hungrystaticsingleton getinstance()

}

懶漢式單例

懶漢式單例的特點是被外部類呼叫的時候內部類才會載入

需要加雙重驗證鎖才能避免執行緒安全隱患

例如

private volatile static lazydoublechecksingleton lazy =

null

;private

lazydoublechecksingleton()

public

static lazydoublechecksingleton getinstance()

}}return lazy;

}

使用了鎖之後,會對程式效能存在一定的影響,我們從類初始化的角度來考慮,採用靜態內部類的方式

例如:

//這種形式兼顧餓漢式的記憶體浪費,也兼顧 synchronized 效能問題

//完美地遮蔽了這兩個缺點

public

class

lazyinnerclasssingleton

//每乙個關鍵字都不是多餘的

//static 是為了使單例的空間共享

//保證這個方法不會被重寫,過載

public

static final lazyinnerclasssingleton getinstance()

//預設不載入

private

static

class

lazyholder

}

內部類一定是要在方

法呼叫之前初始化,巧妙地避免了執行緒安全問題

序列化破壞單例的解決辦法

只需要增加 readresolve()方法即可

例如:

public

class

seriablesingleton

implements

serializable

public

static seriablesingleton getinstance()

private object readresolve()

}

註冊式單例

註冊式單例又稱為登記式單例,就是將每乙個例項都登記到乙個地方,使用唯一的識別獲取例項。

註冊式單例是不會被反射和序列化反序列化破壞的

註冊式單例有兩種寫法:一種是容器快取,一種是列舉登記

列舉的例子:
public

enum enumsingleton

public

void

setdata

(object data)

public

static enumsingleton getinstance()

}

容器快取的寫法

public

class

containersingleton

private

static map ioc =

newconcurrenthashmap

();public

static object getbean

(string classname)

catch

(exception e)

return obj;

}else}}

}

容器式寫法適用於建立例項非常多的情況,便於管理。但是,是非執行緒安全的

threadlocal 執行緒單例

執行緒單例實現 threadlocal。threadlocal 不能保證其

建立的物件是全域性唯一,但是能保證在單個執行緒中是唯一的,天生的執行緒安全。

例如:

public

class

threadlocalsingleton};

private

threadlocalsingleton()

public

static threadlocalsingleton getinstance()

}

單例模式總結:

單例模式可以保證記憶體裡只有乙個例項,減少了記憶體的開銷,可以避免對資源的多重占用。

1、私有化構造器

2、保證執行緒安全

3、延遲載入

4、防止序列化和反序列化破壞單例

5、防禦反射攻擊單例

設計模式之單例模式

前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會23種設計模式並且會熟練運用的人,真的就是大師級的牛人了,設計模式是乙個專案主管或者架構師一定要會的東西...

設計模式之單例模式

package com.xie.singleton public class singleton 提供乙個共有的靜態的入口方法 public static singleton getinstance 懶漢式 延遲載入 提供乙個私有的靜態的成員變數,但不做初始化 private static sing...

設計模式之 單例模式

單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式 單件模式 使用方法返回唯一的例項 public class singleton private static singleton instance public static singleton geti...