請在后臺配置參數,參數名稱:topads
編程語言 php java

java設計模式之單例模式

java HTML我幫您 1年前  5567次瀏覽
java中單例模式是一種常見的設計模式,單例模式分三種:懶漢式單例、餓漢式單例、登記式單例三種。
  單例模式有一下特點:
  1、單例類只能有一個實例。
  2、單例類必須自己自己創建自己的唯一實例。
  3、單例類必須給所有其他對象提供這一實例。
  單例模式確保某個類只有一個實例,而且自行實例化并向整個系統提供這個實例。在計算機系統中,線程池、緩存、日志對象、對話框、打印機、顯卡的驅動程序對象常被設計成單例。這些應用都或多或少具有資源管理器的功能。每臺計算機可以有若干個打印機,但只能有一個Printer Spooler,以避免兩個打印作業同時輸出到打印機中。每臺計算機可以有若干通信端口,系統應當集中管理這些通信端口,以避免一個通信端口同時被兩個請求同時調用。總之,選擇單例模式就是為了避免不一致狀態,避免政出多頭。

這樣的模式有幾個好處:
1、某些類創建比較頻繁,對于一些大型的對象,這是一筆很大的系統開銷。
2、省去了new操作符,降低了系統內存的使用頻率,減輕GC壓力。
3、有些類如交易所的核心交易引擎,控制著交易流程,如果該類可以創建多個的話,系統完全亂了。(比如一個軍隊出現了多個司令員同時指揮,肯定會亂成一團),所以只有使用單例模式,才能保證核心交易服務器獨立控制整個流程。

首先我們寫一個簡單的單例類:
public class Singleton {  

/* 持有私有靜態實例,防止被引用,此處賦值為null,目的是實現延遲加載 */
private static Singleton instance = null;

/* 私有構造方法,防止被實例化 */
private Singleton() {
}

/* 靜態工程方法,創建實例 */
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}

// Other methods...
}
現在給大家列舉幾種我知道的單例模式
1.餓漢式單例類
//餓漢式單例類.在類初始化時,已經自行實例化 
class S1 {
//私有的默認構造子
private S1() {
System.out.println("ok1");
}
//已經自行實例化
private static S1 instance = new S1();

//靜態工廠方法
public static S1 getInstance() {
return instance;
}
}
優點:

1.線程安全的

2.在類加載的同時已經創建好一個靜態對象,調用時反應速度快。

缺點: 資源利用效率不高,可能getInstance永遠不會執行到,但是執行了該類的其他靜態方法或者加載了該類(class.forName),那么這個實例仍然初始化了

//懶漢式單例類.在第一次調用的時候實例化 
class S2 {
//私有的默認構造子
private S2() {}
//注意,這里沒有final
private static S2 single=null;
//靜態工廠方法
public static S2 getInstance() {
if (single == null) {
single = new S2();
}
return single;
}
}
優點:1.線程安全的,
2.在類加載的同時已經創建好一個靜態對象,調用時反應速度快。

缺點: 資源利用效率不高,可能這個單例不會需要使用也被系統加載
public synchronized  static S2 getInstance() {
if (single == null) {
single = new S2();
}
return single;
}
優點:1.資源利用率高
缺點:第一次加載是發應不快 ,多線程使用不必要的同步開銷大
public static S2 getInstance() {  
if (single == null) {
synchronized (single) {
if (single == null) {
single = new S2();
}
}
}
return single;
}
優點:1.資源利用率高
缺點:第一次加載是發應不快 ,由于java 內存模型一些原因偶爾會失敗
登記式單例類
//登記式單例類.
//類似Spring里面的方法,將類名注冊,下次從里面直接獲取。
class S3 {
private static Map map = new HashMap();
static{
S3 single = new S3();
map.put(single.getClass().getName(), single);
}
//保護的默認構造子
protected S3(){}
//靜態工廠方法,返還此類惟一的實例
public static S3 getInstance(String name) {
if(name == null) {
name = S3.class.getName();
System.out.println("name == null"+"-name="+name);
}
if(map.get(name) == null) {
try {
map.put(name, (S3) Class.forName(name).newInstance());
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
return map.get(name);
}
//一個示意性的商業方法
public String about() {
return "Hello, I am RegSingleton.";
}
}

class S3Child extends S3{
public S3Child(){

}
/**
* 靜態工廠方法
*/
public static S3Child getInstance() {
return (S3Child) S3.getInstance("com.html580.singleton.S3Child");
}

/**
* 一個示意性的商業方法
*/
public String about() {
return "Hello, I am RegSingletonChild.";
}

public static void main(String<> args) {
S3Child single3 = S3Child.getInstance();
System.out.println(single3.about());
}
}

















發表評論

经典黑杰克游戏 网上怎么做任务赚钱吗 通化大嘴棋牌手机下载 快彩投注技巧 快乐十分开奖结果 中国体彩浙江11选5 568彩票苹果 杭州聚会赚钱 云南时时规则 排列5开奖直播今晚 江苏e球彩胜平负遗漏 极速快三大小如何稳赚 123期彩票开奖结果 快速赛车彩票 兴发娱乐 龙王捕鱼游戏开发 08年制造业怎么赚钱