天天看點

黑馬程式員-學習日志-單例設計模式

---------------------- ASP.Net+Android+IOS開發、.Net教育訓練、期待與您交流! ----------------------

設計模式是解決某一類問題最行之有效的方法。單例設計模式是解決一個類在記憶體隻存在一個對象,想要保證對象唯一。

Runtime()方法就是單例設計模式進行設計的。

一,如何保證對象唯一性呢?

思想:

1,不讓其他程式建立該類對象.

2,在本類中建立一個本類對象。

3,對外提供方法,讓其他程式擷取這個對象。

二,步驟:

1,因為建立對象都需要構造函數初始化,隻要将本類中的構造函數私有化,其他程式就無法再建立該類對象;

2,就在類中建立一個本類的對象;

3,定義一個方法,傳回該對象,讓其他程式可以通過方法就得到本類對象。

三,代碼展現:

1,私有化構造函數;

2,建立私有并靜态的本類對象;

3,提供一個方法可以擷取到該對象。

餓漢式:

class student {
        private student(){}// //私有化構造函數。
        private static student s=new student();//建立私有并靜态的本類對象。
        public static student getstudent(){//提供一個方法擷取該對象
                return s;
        }
  }
           

懶漢式:

class student {
        private student(){}
        private static student s=null;
        public static student getstudent(){
                if(s==null){
                        s=new student();
                }
                return s;
        }
}
           

1.懶漢式和餓漢式的不同之處是:懶漢式的特點是延時加載;

2.懶漢式延時加載有問題,如果多線程通路時會出現安全問題;

3.解決安全問題的方法是:可以加同步來解決,而同步的方式有加同步代碼塊和同步函數,但是效率有些低,是以用雙重判斷的形式能解決效率問題。

4.用同步代碼塊解決:

  class student {
        private student(){}
        private static student s=null;
        public static synchronized student getstudent(){
                if(s==null){
                        s=new student();
                }
                return s;
        }
}
           

5. 用雙重判斷解決如下:

class student {
        private student(){}
        private static student s=null;
        public static  student getstudent(){
                if(s==null){
                        synchronized(student.class){
                                if(s==null)
                                        s=new student();
                        }
                }
                return s;
        }
}
           

一般情況下定義單例時使用餓漢式;

---------------------- ASP.Net+Android+IOS開發、.Net教育訓練、期待與您交流! ----------------------詳細請檢視:http://edu.csdn.net

繼續閱讀