什么是單例模式
1. 單例(單個的實例)
- 所謂類的單例設(shè)計模式,就是采取一定的方法保證在整個的軟件系統(tǒng)中,對某個類只能存在一個對象實例,并且該類只提供一個取得其對象實例的方法。
- 單例模式有兩種方式:1) 餓漢式 2) 懶漢式
2. 單例模式應(yīng)用實例
演示餓漢式和懶漢式單例模式的實現(xiàn)。
步驟如下:文章來源:http://www.zghlxwxcb.cn/news/detail-660105.html
- 構(gòu)造器私有化 =》 防止其他類直接 new
- 類的內(nèi)部創(chuàng)建對象
- 向外暴露一個靜態(tài)的公共方法。getInstance
- 代碼實現(xiàn)
package com.xjz.single_;
/**
* 單例模式[餓漢式]
* 1. 只要完成類加載,同步創(chuàng)建好對象, 即使用戶沒有調(diào)用 getInstance() 方法, 對象也會被創(chuàng)建。
* 2. 餓漢式不存在線程安全問題
*/
public class SingleTon01 {
public static void main(String[] args) {
//GirlFriend girlFriend = new GirlFriend("小白");
//GirlFriend girlFriend = new GirlFriend("小張");
//通過方法可以獲取 gf 對象
GirlFriend instance = GirlFriend.getInstance();
System.out.println(instance); //GirlFriend{name='小紅紅'}
GirlFriend instance2 = GirlFriend.getInstance();
System.out.println(instance2); //GirlFriend{name='小紅紅'}
System.out.println(instance == instance2); //true
// System.out.println(GirlFriend.n1); //構(gòu)造器被調(diào)用 888
}
}
//只有一個類,GirlFriend
//只能有一個女朋友
class GirlFriend{
private String name;
public static int n1 = 888;
//為了能夠在靜態(tài)方法中,返回 gf對象,需要將其修飾為 static
//對象,通常是重量級的對象,餓漢式可能造成了創(chuàng)建了對象,但是還沒有是試用
public static GirlFriend gf = new GirlFriend("小紅紅");
//如何保障我們只能創(chuàng)建一個 GirlFriend 對象
//步驟[單例模式-餓漢式]
//1. 將構(gòu)造器私有化
//2. 在類的內(nèi)部直接創(chuàng)建對象(該對象是 static)
//3. 提供一個公共的 static 方法,返回 gf 對象
private GirlFriend(String name) {
System.out.println("構(gòu)造器被調(diào)用");
this.name = name;
}
//靜態(tài)的公共方法,用來返回對象
public static GirlFriend getInstance(){
return gf;
}
@Override
public String toString() {
return "GirlFriend{" +
"name='" + name + '\'' +
'}';
}
}
package com.xjz.single_;
/**
* 演示懶漢式的單例模式
* 懶漢式,只有當(dāng)用戶使用 getInstance 時,才返回 cat對象,后面再次調(diào)用時,會返回上次創(chuàng)建的 cat對象
* 懶漢式存在線程安全問題
*/
public class SingleTon02 {
public static void main(String[] args) {
System.out.println(Cat.n1); //打印666,且不會調(diào)用構(gòu)造器(創(chuàng)建cat對象)
Cat instance = Cat.getInstance();
System.out.println(instance);//構(gòu)造器調(diào)用,創(chuàng)建cat對象
}
}
//希望在程序運行過程中,只能創(chuàng)建一個 Cat 對象
//使用單例模式
class Cat{
private String name;
public static int n1 = 666;
private static Cat cat; //默認是 null
//步驟
//1. 仍然構(gòu)造器私有化
//2. 定義一個 static 靜態(tài)屬性對象
//3. 提供一個 public 的 static 方法,可以返回一個 Cat對象
//4. 懶漢式,只有當(dāng)用戶使用 getInstance 時,才返回 cat對象,后面再次調(diào)用時,會返回上次創(chuàng)建的 cat對象
// 從而保證了單例
private Cat(String name){
System.out.println("構(gòu)造器調(diào)用...");
this.name = name;
}
public static Cat getInstance(){
if (cat == null){ //如果還沒有創(chuàng)建 cat對象
cat = new Cat("小可愛");
}
return cat;
}
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
'}';
}
}
3. 餓漢式 VS 懶漢式
- 二者最主要的卻別在于創(chuàng)建對象的時機不同:餓漢式是在類加載就創(chuàng)建了對象實例,而懶漢式是在使用時才創(chuàng)建。
- 餓漢式不存在線程安全問題,懶漢式存在線程安全問題。
- 餓漢式存在浪費資源的可能,因為如果程序員一個對象實例都沒有使用,那么餓漢式創(chuàng)建的對象就浪費了,懶漢式是使用時才創(chuàng)建,所以就不存在這個問題。
- 在我們 javaSE標(biāo)準(zhǔn)類中,java.lang.Runtime 就是經(jīng)典的單例模式[餓漢式]
文章來源地址http://www.zghlxwxcb.cn/news/detail-660105.html
到了這里,關(guān)于什么是單例模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!