單例模式的設計:
1 //Single類進內存,對象還沒有存在,只有調用了getInstance方法時,才建立對象。
1 //對象是方法被調用時,才初始化,也叫做對象的延時加載。成為:懶漢式。 2 //Single類進內存,對象還沒有存在,只有調用了getInstance方法時,才建立對象。 3 class Single 4 { 5 private static Single s = null;//創建對象 6 private Single(){}//防止被其他類對該類進行實例化,避免被調用 7 public static Single getInstance() 8 { 9 //A B 10 if(s==null)//如果A,B為空則進入 11 { 12 synchronized(Single.class)//A 進入后 此處功能是防止B進入,加入同步鎖 只允許一個實例進入 13 { 14 if(s==null)//A為null 15 //對A進行實例化 再返回同步快12行,此時只有一個對象B,可以進入同步鎖,到14行此時對象不為空因為實例化了A ,直接返回S 16 s = new Single(); 17 } 18 } 19 return s; 20 } 21 } 22 23 //記錄原則:定義單例,建議使用餓漢式。
1 /* 2 這個是先初始化對象。 3 稱為:餓漢式。 4 5 Single類一進內存,就已經創建好了對象。 6 class Single 7 { 8 private static Single s = new Single(); 9 private Single(){} 10 public static Single getInstance() 11 { 12 return s; 13 } 14 } 15 */ 16 17 //對象是方法被調用時,才初始化,也叫做對象的延時加載。稱為:懶漢式。 18 //Single類進內存,對象還沒有存在,只有調用了getInstance方法時,才建立對象。 19 class Single 20 { 21 private static Single s = null; 22 private Single(){} 23 public static Single getInstance() 24 { 25 if(s==null) 26 { 27 synchronized(Single.class) 28 { 29 if(s==null) 30 s = new Single(); 31 } 32 } 33 return s; 34 } 35 } 36 37 //記錄原則:定義單例,建議使用餓漢式。 38 39 class 40 { 41 public static void main(String[] args) 42 { 43 System.out.println("Hello World!"); 44 } 45 }
餓漢式
1 /* 2 設計模式:解決某一類問題最行之有效的方法。 3 java中23種設計模式: 4 單例設計模式:解決一個類在內存只存在一個對象。 5 6 7 想要保證對象唯一。 8 1,為了避免其他程序過多建立該類對象。先禁止其他程序建立該類對象 9 2,還為了讓其他程序可以訪問到該類對象,只好在本類中,自定義一個對象。 10 3,為了方便其他程序對自定義對象的訪問,可以對外提供一些訪問方式。 11 12 這三部怎么用代碼體現呢? 13 1,將構造函數私有化。 14 2,在類中創建一個本類對象。 15 3,提供一個方法可以獲取到該對象。 16 17 18 19 對於事物該怎么描述,還怎么描述。 20 當需要將該事物的對象保證在內存中唯一時,就將以上的三步加上即可。 21 22 23 */ 24 25 class Single 26 { 27 28 29 private Single(){} 30 31 private static Single s = new Single(); 32 33 public static Single getInstance() 34 { 35 return s; 36 } 37 } 38 39 40 class SingleDemo 41 { 42 public static void main(String[] args) 43 { 44 Single s1 = Single.getInstance(); 45 Single s2 = Single.getInstance(); 46 47 s1.setNum(23); 48 49 System.out.println(s2.getNum()); 50 51 52 53 // Single s1 = new Single(); 54 // Single s2= new Single(); 55 // s1.setNum(30); 56 // System.out.println(s2.getNum()); 57 58 // Student s1 = new Student(); 59 // s1.setAge(30); 60 // 61 // Student s2 = new Student(); 62 // s2.setAge(12); 63 64 Student s1 = Student.getStudent(); 65 Student s2 = Student.getStudent(); 66 67 68 69 70 } 71 } 72 73 74 75 class Student 76 { 77 private int age; 78 79 80 private static Student s = new Student(); 81 private Student(){} 82 public static Student getStudent() 83 { 84 return s; 85 } 86 87 88 89 public void setAge(int age) 90 { 91 this.age = age; 92 } 93 public int getAge() 94 { 95 return age; 96 } 97 }