單例模式的定義:數據庫
確保某一個類只有一個實例,並且自行實例化像整個系統提供這個實例。安全
單例模式通用類以下:dom
通用代碼以下:函數
public class Singleon { //定義靜態singleon private final static Singleon singleon = new Singleon(); /** * <p>Title: </p> * <p>Description: 不準外部調用構造函數</p> */ private Singleon() { } // 取得實例對象 public static Singleon getSingleon(){ return singleon; } //其餘方法,儘可能使static public static void doSomething(){ } }
單例模式優勢:
1.內存中只有一個實例,減小內存開支。
2.避免對資源的多重佔用,例如一個文件的書寫動做
3.單例模式能夠在系統設置全局的訪問點,優化和共享資源訪問。工具
單列模式使用的場景:
1. 要求生成惟一序列號的環境;
2. 在整個項目中須要一個共享訪問點或共享數據。
3. 建立一個對象須要消耗的資源過多,若是要訪問IO和數據庫等資源;
4. 須要定義大量靜態常量和靜態方法(如工具類)的環境,能夠採用單例模式測試
單例模式的注意事項優化
1.線程不安全spa
public class Singleon { //定義靜態singleon private static Singleon singleon = null; /** * <p>Title: </p> * <p>Description: 不準外部調用構造函數</p> */ private Singleon() { } // 取得實例對象 public static Singleon getSingleon(){ if(singleon==null){ singleon = new Singleon(); } return singleon; } //其餘方法,儘可能使static public static void doSomething(){ } }
2.線程安全線程
public class Singleon { //定義靜態singleon private static Singleon singleon = null; /** * <p>Title: </p> * <p>Description: 不準外部調用構造函數</p> */ private Singleon() { } // 取得實例對象 public static synchronized Singleon getSingleon(){ if(singleon==null){ singleon = new Singleon(); } return singleon; } //其餘方法,儘可能使static public static void doSomething(){ } }
單例模式的擴展code
public class SingleonEx { //實例的數量 private static final int MAXNUM = 3; // 裝載 SingleonEx private static ArrayList<SingleonEx> singleonLIst = new ArrayList<SingleonEx>(); // private static ArrayList<String> nameList = new ArrayList<String>(); // private static int iCount= 0; //初始化..... static{ for(int i=0;i<MAXNUM; i++){ singleonLIst.add(new SingleonEx("單例擴展:" + i )); } } /** * * <p>Title: </p> * <p>Description: 無參構造</p> */ private SingleonEx() { } /** * * <p>Title: </p> * <p>Description: 有參構造</p> * @param name */ private SingleonEx(String name){ nameList.add(name); } /** * * @Title: getInstance * @Description: 獲取實例對象 * @param @return 設定文件 * @return SingleonEx 返回類型 * @throws */ public static SingleonEx getInstance() { //隨機數.... Random rnd = new Random(); //隨機產生一個 iCount=rnd.nextInt(MAXNUM); // return singleonLIst.get(iCount); } /** * * @Title: say * @Description: 測試使用打印點東西... * @param 設定文件 * @return void 返回類型 * @throws */ public static void say() { System.out.println(nameList.get(iCount)); } /** * * @Title: main * @Description: 入口測試用 * @param @param args 設定文件 * @return void 返回類型 * @throws */ public static void main(String[] args){ //定義測試5個 int iTest = 5; for(int i=0;i< iTest; i++){ SingleonEx sEx = SingleonEx.getInstance(); sEx.say(); } } }