設計模式之一 單例模式

單例模式的定義:數據庫

確保某一個類只有一個實例,並且自行實例化像整個系統提供這個實例。安全

單例模式通用類以下:dom

image

通用代碼以下:函數

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();
         }
         
     }

}
相關文章
相關標籤/搜索