一、定義
單例模式是一個比較簡單的模式,其定義如下:確保某一個類只有一個實例,而且自行實例化並向整個系統提供這個實例。
通用寫法如下:
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); } }