用Java輸出等腰三角形
阿新 • • 發佈:2020-12-10
單例模式:一個類只能有一個例項(只能創建出一個物件),為了節省記憶體資源
怎麼保證只有一個例項?
我們知道,當建立一個新物件時,我們會呼叫類的構造方法,建立多個物件,那我們就會呼叫多次構造方法,現在我們要保證只有一個例項,也就是說我們不管建立多少個物件,都只調用一次構造方法,那麼怎麼實現呢?我們可以給構造方法加上private修飾符,這樣構造方法就只能被本類訪問了,其他地方你要建立類物件,要訪問構造方法就會被拒絕,但是這樣的話在其他類要建立物件時就不能使用當前類物件了,所以為了解決這個問題,可以對外提供一個公共方法返回一個物件。
總結一下就是:
-
構造方法私有化
-
對外提供一個公共方法返回一個物件
程式碼實現:
/**
* @author PgRightWu
* @version 1.0
* @date 2020/12/8 16:42
* @description 單例模式
*/
/*
* 單例模式步驟
* 1.構造方法私有化
* 2.對外提供公共方法返回一個物件
* */
public class Singleton {
// 1.構造私有化
private Singleton(){}
// 餓漢式(一開始就建立)
private static Singleton s = new Singleton();
// 2.對外提供私有方法保證返回一個物件(因為外部呼叫類的方法要例項化物件,所以用static修飾,可以通過類名呼叫)
public static Singleton getSingleton(){
return s;
}
}
class TestSingleton{
public static void main(String[] args) {
Singleton s1 = Singleton.getSingleton();
Singleton s2 = Singleton.getSingleton();
Singleton s3 = Singleton.getSingleton();
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
}
}
這樣的話,不管建立多少個Singleton物件,都是指向同一個記憶體地址,也就是隻有一個例項
執行效果:
採用懶漢式實現單例模式,其實也很簡單,懶漢式就是什麼時候用就什麼時候建立物件
實現程式碼:
public class Singleton {
// 1.構造私有化
private Singleton(){}
// 懶漢式(什麼時候用什麼時候建立)
private static Singleton s;
// 2.對外提供私有方法保證返回一個物件(因為外部呼叫類的方法要例項化物件,所以用static修飾,可以通過類名呼叫)
public static Singleton getSingleton(){
if(s==null)
s = new Singleton();
return s;
}
}
現在我們來聊一聊單例模式餓漢式與懶漢式的區別
- 餓漢式是在類載入時就進行例項化,而懶漢式預設不會例項化,是什麼時候new什麼時候才例項化
- 餓漢式是執行緒安全的,因為在類載入時物件就已經例項化了,而懶漢式不是執行緒安全的,是什麼時候用就什麼時候例項化,這樣當多個執行緒同時需要例項化某個物件時,訪問例項化程式碼,就會生成多個物件,所以是執行緒不安全的(可以通過同步鎖解決)。
- 餓漢式是在類載入時例項化物件,所以會佔用記憶體空間,造成記憶體空間的浪費,而懶漢式是什麼時候用什麼時候例項化物件,相對不會造成記憶體浪費。