單例設計模式(懶漢式,餓漢式)


 

 

 

 

設計模式:解決問題的一種行之有效的思想

單例設計模式:保證了一個類在內存中只能有一個對象,比如多程序訪問一個配置文件,希望多程序操作都是同一個配置文件中的數據,那么就需要保證該配置文件對象的唯一性。

思路:1.怎么做才能保證這個對象是唯一的呢?其他程序通過new創建該類對象時根本無法控制個數,那么,就不讓其他程序創建該類的對象了,因為不可以控制。2、不讓其他程序創建,就該在本類中自己創建一個對象。3、該類將創建的對象對外提供,讓其他程序獲取並使用。

步驟:1、怎么實現不讓其他程序創建該類對象呢?將該類中的構造函數私有化。

比如:class Single

        { 

       private Single();

         }

        2、在本類中創建一個本類對象

比如   class Single

        {

         private Single(){};

         private  Single s = new Single();

         }

       3、定義一個方法,返回值是本類類型。讓其他程序通過該方法就可以獲得該類對象。但是這個方法一定是public的

比如:

  class Single

  {

     private Single(){};

     private static  Single s = new Single();

     public  static    Single getInstance()

       {

           return s;

       }

  }

}

示例:

package com_package2;

public class Single {
    private Single(){};
    private static Single s= new Single();
    public static Single Instance()
    {
        return s;
        
    }

}
package com_package2;

public class SingleDemo {

    /**
     * @param args
     */
    public static void main(String[] args) {
        
        Single s1 = Single.Instance(); // TODO Auto-generated method stub

    }

}

package com_package2;

public class Single {
    private Single(){};
    private static Single s = new Single();
    public static  Single Instance()
    {
        return s;
        
    }
    
}//餓漢式
package com_package2;

public class Single2 {
    private Single2(){};
    private static Single2 s2 = null;
    public static Single2 Instance()
    {
         if(s2==null)
             s2=new Single2();
          return s2;
        
    }

}//懶漢式,也叫做單例的延遲加載方式

開發的時候一般用第一種模式,餓漢式,因為在涉及到多線程的問題式,懶漢式會導致一系列的安全隱患,但是懶漢式是單例模式中的重要考察點

package com_package2;

public class ArrayTool {
private ArrayTool(){};//這句話就不讓其他的程序再創建新的對象了。
public static int Max(int []arr) { int max=0; for(int i=1;i<arr.length;i++) { if(arr[i]>arr[max]) { max=i; } else continue; } return arr[max]; } public static int Min(int []arr) { int min=0; for(int i=0;i<arr.length;i++) { if(arr[i]<arr[min]) { min=i; } else continue; } return arr[min]; } }
package com_package2;

public class ArraysDemo {

    /**
     * @param args
     */
    public static void main(String[] args) {
        
        int[] a={1,7,4,5,3,3,6};
        int maxs =ArrayTool.Max(a);
        int mins = ArrayTool.Min(a);
        System.out.println("maxs="+" "+maxs);
        System.out.println("mins="+" "+mins);
        // TODO Auto-generated method stub

    }

}

maxs= 7
mins= 1

 

在上面的類中,由於兩個方法都沒有訪問到特有變量,所有都可以加static所以在帶有主函數的類中引用這些方法的時候就可以用類名直接調用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM