單例設計模式


什么是設計模式

  1. 靜態方法和屬性的經典使用

  2. 設計模式是:在大量的實踐中總結和理論化之后優選的代碼結構、編程風格以及解決方法

什么是單例模式

  • 單個實例的設計模式

  • 所謂類的單例設計模式,就是采用一定的方法保證在整個的軟件系統中,對某個類只能存在一個對象的實例,並且該類只提供一個取得其對象實例的方法

單例模式的分類:

  1. 餓漢式

  2. 懶漢式

餓漢式與懶漢式的區別

  1. 二者最大的區別是:創建時機不同:餓漢式在類加載的時候就創建了對象實例。而懶漢式是在使用時才存在

  2. 餓漢式不存在線程安全問題,懶漢式存在線程安全問題-----(當多個線程同時進入判斷時)

  3. 餓漢式存在浪費資源的可能,因為如果程序員一個對象實例都沒有使用,那么餓漢式創建的對象就浪費了。懶漢式是使用時才創建,就不存在這個問題

  4. javaSE標准類中,java.lang.Runtime就是經典的單例模式

餓漢式

步驟實現:

  1. 構造器私有化

  2. 類的內部創建對象

  3. 向外暴露一個靜態的公共方法。getInstance

代碼實現:

/**
* 餓漢式
* 1. 構造器私有化-----防止在類的外部直接創建
* 2. 在類的內部創建對象(該對象是靜態的)
* 3. 向外暴露一個靜態的公共方法。getInstance
* 他為什么是餓漢式
* 因為:
*     當調用類的靜態變量時,會導致類被加載,靜態的對象會被執行。靜態對象一執行,那么這個對象就會存在了
*/
public class SingleTon01 {
   public static void main(String[] args) {
       Cat instance = Cat.getInstance();
       System.out.println(instance);
       Cat instance1 = Cat.getInstance();
       System.out.println(instance1);
       //instance對象與instance1同一個對象
       System.out.println(instance==instance1);//true
  }
}
class  Cat{
   private String name;
   public static  int n1 = 100;
   //為了在靜態方法中,返回其對象,需要將其修飾為靜態方法
   //對象,通常為重量級的對象,餓漢式可以會造成創建了對象,但沒有使用,會造成資源的浪費
   private static Cat cat = new Cat("小紅");
   private Cat(String name) {
       this.name = name;
  }
   public static Cat getInstance(){

       return cat;
  }

   @Override
   public String toString() {
       return "Cat{" +
               "name='" + name + '\'' +
               '}';
  }
}

懶漢式

步驟:

  • 1.構造器私有化

  • 2.定義一個私有的靜態屬性對象

  • 3.提供一個public 的static方法---中間加判斷

代碼實現:

/**
* 懶漢式
*
*   當類被調用是,不會創建對象,需要自己調用,后面再次調用,會返回上次創建的對象,從而保證了單例
*/
public class SingleTon02 {
   public static void main(String[] args) {
       Dog instance = Dog.getInstance();
       System.out.println(instance);
       //第二次調用的時候,會得到上次創建的對象
       Dog instance1 = Dog.getInstance();
       System.out.println(instance1);
       System.out.println(instance==instance1);//true
  }
}
class Dog{
   private  String  name;
   private  static  Dog dog;
   private Dog(String name) {
       this.name = name;
  }
   public  static Dog getInstance(){
       if(dog == null){
           dog = new Dog("大黃");
      }
       return dog;
  }

   @Override
   public String toString() {
       return "Dog{" +
               "name='" + name + '\'' +
               '}';
  }
}

 


免責聲明!

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



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