java 單例模式的設計
阿新 • • 發佈:2018-11-05
java 單例模式的設計
1.什麼是設計模式
設計模式是在大量的實踐中總結的理論化之後優選的程式碼結構、編碼風格,以及解決問題的思考方式。設計模式就像經典經典的棋譜,不同的棋局,我們用不同的棋譜,免去我們自己在思考和摸索。
2.什麼是單例模式
類的的單例設計模式,就是在採取一定的方法保證在整個軟體系統中,對某個類只能存在一個物件例項,並且該類只提供一個取得其物件例項的方法。如果我們要讓類在一個虛擬機器中只能產生一個物件。
3.java設計單例模式的方法
首先必須先將類的構造方法的訪問許可權設定為private,這樣就不能用new操作符在類的外部產生類的物件了,但在類的內部仍然可以產生物件。因為在類的外部開始還無法取得類的物件,只能呼叫該類的某個靜態方法以返回類內部建立的物件,靜態方法只能訪問類中的靜態成員變數,所以,指向類內部產生的該類物件的變數也必須定義為成靜態的。
4.餓漢式demo,內附java單例模式的實現步驟
單例的設計模式: *1.解決的問題,使一個類只能夠建立一個物件 *2.如何實現? */ //餓漢式 public class Test { public static void main(String[] args) { Singleton s1 = Singleton.getInstance(); Singleton s2 = Singleton.getInstance(); System.out.println(s1 == s2);//true } } //只能建立Singletong的單個例項 class Singleton{ //1.私有化構造器,使得在類的外部不能夠呼叫構造器 private Singleton(){ } //2.自己在類的內部建立一個類的例項 private static Singleton instance = new Singleton(); //3.私有是此物件,通過公共的方法來呼叫,體現封裝性 //4.此公共的方法,只能通過類來呼叫,因為設定為static的,同時類的例項也必須是static public static Singleton getInstance() { return instance; } }
5.懶漢式demo,內附java單例模式的實現步驟
//懶漢式
public class Test2 {
public static void main(String[] args) {
Singleton1 s1 = Singleton1.getInstance();
Singleton1 s2 = Singleton1.getInstance();
System.out.println(s1 == s2);//true
}
}
class Singleton1{
//1.私有化構造器,使得在類的外部不能夠呼叫構造器
private Singleton1() {
}
//2.自己在類的內部建立一個類的例項,使其等於null
private static Singleton1 instance = null;
//3.宣告公共的獲取方法,只能通過類來呼叫,因為設定為static同時例項也必須為static宣告的
public static Singleton1 getInstance() {
//4.懶漢式特點,判斷是否已經例項化過了,有則直接返回,無則new一個。
if(instance == null) {
instance = new Singleton1();
}
return instance;
}
}
6.餓漢式和懶漢式的區別和特點
餓漢式:
- 開始就給建立好了例項,呼叫公共方法的時候,直接返回。開始就給建立好了例項,呼叫公共方法的時候,直接返回。
- 記憶方法,餓漢式一開始就很餓,所以一進來就直接建立例項。
懶漢式:
- 一開始宣告為null,等要呼叫的時候再去new一個例項,然後再返回。
- 記憶方法,懶漢式很懶,沒有到要呼叫時候不會去進行new。
- 優點:如果沒呼叫,記憶體中不會存在Singleton例項的。
- 缺點:可能存線上程安全問題,執行緒掛起和啟用問題。
7.jdk類單例模式的典型應用
public class Runtime {
private static Runtime currentRuntime = new Runtime();
public static Runtime getRuntime() {
return currentRuntime;
}
//---------------------------下面程式碼方法先不用看,上面其實就是單例模式餓漢式的應用-------------------
public void exit(int status) {
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkExit(status);
}
Shutdown.exit(status);
}
public void addShutdownHook(Thread hook) {
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
sm.checkPermission(new RuntimePermission("shutdownHooks"));
}
ApplicationShutdownHooks.add(hook);
}
...
}