設計模式之單例模式

一、定義

    單例模式是一個比較簡單的模式,其定義如下:確保某一個類只有一個實例,而且自行實例化並向整個系統提供這個實例。

    通用寫法如下:

public class Singleton {

 private static final Singleton singleton=new Singleton();

 //構造方法私有化

 private Singleton(){

  

 }

 //提供公有方法獲取實例對象

 public static Singleton getInstance(){

  return singleton;

 }

}

二、應用

    在一個系統中,要求一個類有且僅有一個對象,如果出現多個對象就會出現“不良反應”,可以採用單例模式,通用場景如下:

    A、要求生成唯一序列號的環境。

    B、在整個項目中需要一個共享訪問點或共享數據,例如一個Web頁面上的計數器。

    C、創建一個對象需要消耗的資源過多。

    D、需要定義大量的靜態常量和靜態方法的環境(也可直接使用static方法)。

 

三、注意事項

    在高併發情況下,注意單例模式的線程同步問題。單例模式有很多種不同的實現方式,下面的方式就需要考慮線程同步:

public class Singleton {

 private static Singleton singleton=null;

 //構造方法私有化

 private Singleton(){

  

 }

 //提供公有方法獲取實例對象

 public static Singleton getInstance(){

  if(singleton==null){

   singleton = new Singleton();

  }

  return singleton;

 }

}

可以通過synchronized關鍵字來解決線程同步問題。

 

四、擴展

    前面所說都是一個類產生一個對象,但如果一個類可以產生固定數量的對象呢?

import java.util.ArrayList;
import java.util.Random;

public class Singleton {
 //定義產生的實例對象數量
 private static int num = 2;
 //實例對象的名稱集合
 private static ArrayList<String> nameList=new ArrayList<String>();
 //實例對象的集合
 private static ArrayList<Singleton> objectList=new ArrayList<Singleton>();
 //當前實例的序號
 private static int count = 0;
 
 //產生所有的對象
 static{
  for(int i=0;i<num;i++){
   objectList.add(new Singleton("單例"+i+1));
  }
 }
 
 private Singleton(){
  
 }
 
 private Singleton(String name){
  nameList.add(name);
 }
 
 //隨機獲取一個對象
 public static Singleton getInstance(){
  Random random = new Random();
  count = random.nextInt(num);
  return objectList.get(count);
 }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章