單例模式也是一種比較常見的設計模式,它到底能帶給我們什麼好處呢?其實無非是三個方面的作用:
1、控制資源的使用,通過線程同步來控制資源的併發訪問;
2、控制實例產生的數量,達到節約資源的目的。
3、作爲通信媒介使用,也就是數據共享,它可以在不建立直接關聯的條件下,讓多個不相關的兩個線程或者進程之間實現通信。
單例模式分三種:懶漢式單例、餓漢式單例、登記式單例三種。
單例模式有一下特點:
1、單例類只能有一個實例。
2、單例類必須自己創建自己的唯一實例。
3、單例類必須給所有其他對象提供這一實例。
懶漢式:
package cn.Instance.impl;
public class Instance_1 {
//在內存中緩存一個實例空間
private
static Instance_1 instance_1 =null;
//收回外部類實例的權限
private
Instance_1(){
}
public
static Instance_1 getInstance_1(){
//對於線程不安全的代碼進行同步
synchronized(Instance_1.class){
//判斷是否存在類實例如果不存在就實例化一個
if
(instance_1==null) {
instance_1=new Instance_1();
}
}
//如果存在就返回已存在的
return
instance_1 ;
}
}
餓漢式:
package cn.Instance.impl;
public class Instance_2 {
//在類加載的時候就實例化一個類實例
private
Instance_2 instance_2=new Instance_2();
//收回外部對於該類的實例化權限
private
Instance_2(){
}
//定義返回實例的方法
public
Instance_2 getInstance_2(){
return
instance_2;
}
}
登記式——控制實例的數量:
package cn.Instance.impl;
import java.util.HashMap;
import java.util.Map;
public class Instance_3 {
private
static Map map=new HashMap();
//定義當前實例個數
private
static int NUM=1;
//定義最大實例個數
private
static int COUNT=3;
public
static Instance_3 getInstance_3() {
Instance_3
instance_3=(Instance_3) map.get(NUM);
//判斷是否存在實例
if
(instance_3==null) {
instance_3=new Instance_3();
map.put(NUM,
instance_3);
}
NUM++;
//判斷是否超過限定的實例個數
if
(NUM>COUNT) {
NUM=1;
}
return
instance_3 ;
}
}