1. 程式人生 > >java 單例模式的設計

java 單例模式的設計

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.餓漢式和懶漢式的區別和特點

餓漢式:

  1. 開始就給建立好了例項,呼叫公共方法的時候,直接返回。開始就給建立好了例項,呼叫公共方法的時候,直接返回。
  2. 記憶方法,餓漢式一開始就很餓,所以一進來就直接建立例項。

懶漢式:

  1. 一開始宣告為null,等要呼叫的時候再去new一個例項,然後再返回。
  2. 記憶方法,懶漢式很懶,沒有到要呼叫時候不會去進行new。
  3. 優點:如果沒呼叫,記憶體中不會存在Singleton例項的。
  4. 缺點:可能存線上程安全問題,執行緒掛起和啟用問題。

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);
    }
	...
}