java單例設計模式

大資料-劉耀文發表於2018-09-05

單例設計模式:一個類只允許有一個物件,建立一個全域性的訪問點,將他提供出去供大家使用.

package com.qianfeng.test;
/*
* 設計模式:將前人總結好的經驗我們直接拿來使用.
* 一共有23種,常用的有單例設計模式,模板設計模式,工廠設計模式,裝飾設計模式,介面卡設計模式,代理設計模式.
*
* 單例設計模式:一個類只允許有一個物件,建立一個全域性的訪問點,將他提供出去供大家使用.
* 分析:
* 1.使用者只允許有一個物件
* 2.單例類
* 3.全域性的訪問點:得到的唯一的物件就是全域性的訪問點,怎麼做到全域性?—static
* 4.提供出去?
* 5.供大家使用?—單例的功能,通過給單例類新增成員實現
*
* * 單例類的作用:1.可以實現兩個物件之間的傳值
* 2.可以在全域性範圍內呼叫很多的功能.
* 好處:可以讓兩個物件在完全沒有關係的前提下,實現值的傳遞,降低了耦合性,提高了內聚性
*
* 耦合性,內聚性在微觀上說:描述的是類與類之間的關係
* 好處:我們應該儘量提高內聚性,減少耦合性,可以提高程式的健壯性,增加程式碼的可移植性,方便實現模組兒化程式設計
*
* 如何做到低耦合高內聚?
* 在處理類與類關係的時候,讓類之間的關係越緊密耦合性越高,內聚性越低.反之,關係越鬆散耦合性越低,內聚性越高.
*/

//單例類
//餓漢式:在定義變數的同時完成賦值
class SingleInstance {
// 第二步:在單例類的內部建立當前類的物件,私有化並變成靜態的
private static SingleInstance singleInstance = new SingleInstance();

// 第一步:將構造方法私有化
private SingleInstance() {

}

// 第三步:建立一個靜態的公共的方法,將單例類物件提供出去
public static SingleInstance getInstance() {
    return singleInstance;
}

// 功能區---一般建立的是非靜態的成員實現功能
// 建立成員變數
// 建立成員方法

}

// 單例類
// 懶漢式:開始只是定義變數,什麼時候使用,什麼時候賦值
class SingleInstance1 {
// 第二步:在單例類的內部建立當前類的物件,私有化並變成靜態的
private static SingleInstance1 singleInstance = null;

// 第一步:將構造方法私有化
private SingleInstance1() {

}

// 第三步:建立一個靜態的公共的方法,將單例類物件提供出去
public static SingleInstance1 getInstance() {
    if (singleInstance == null) {// 為了保證物件的唯一性
        singleInstance = new SingleInstance1();
    }

    return singleInstance;
}

// 功能區---一般建立的是非靜態的成員實現功能
// 建立成員變數
// 建立成員方法
int num;

}

// 例項:有兩個類A,B.要求將A中的值傳到B類中
class A {
int num1;

// 通過單例傳值
public void danLiTest1() {
    SingleInstance1 singleInstance1 = SingleInstance1.getInstance();
    singleInstance1.num = num1;
}

}

class B {
int num2;

// 通過傳參實現傳值
public void chanCanTest(A a) {
    num2 = a.num1;
}

// 通過單例傳值
public void danLiTest2() {
    SingleInstance1 singleInstance1 = SingleInstance1.getInstance();
    num2 = singleInstance1.num;
}

}

public class Demo5 {

public static void main(String[] args) {

    // SingleInstance singleInstance1 = new SingleInstance();
    // SingleInstance singleInstance2 = new SingleInstance();
    // System.out.println(singleInstance1 == singleInstance2);// false

    // 使用單例
    SingleInstance singleInstance1 = SingleInstance.getInstance();
    SingleInstance singleInstance2 = SingleInstance.getInstance();
    System.out.println(singleInstance1 == singleInstance2);// true

    // 要求將A中的值傳到B類中
    A a = new A();
    B b = new B();

    a.num1 = 4;

    // 傳值第一種方法:直接傳值
    // 不可取,一般成員變數都是私有的
    b.num2 = a.num1;

    // 第二種方式:傳參,讓A類與B類之間產生了關係.
    b.chanCanTest(a);

    // 第三種方式:通過單例傳值,讓A類與B類之間是獨立的
    a.danLiTest1();
    b.danLiTest2();
}

}


Runtime:執行時類

package com.qianfeng.test;

/*
* Runtime:執行時類:
*
* 每個java應用程式都有一個runtime類例項,使應用程式能夠與其執行的環境相連線。
* 可以通過getRuntime方法獲取當前執行時。
*
* 應用程式不能建立自己的runtime類例項。
*/

public class Demo6 {

public static void main(String[] args) {

    // 獲取單例類物件
    Runtime runtime = Runtime.getRuntime();
    // 單位預設是位元組
    System.out.println(runtime.freeMemory() / 1024. / 1024.);// 剩餘的/空閒的記憶體量
    System.out.println(runtime.maxMemory() / 1024. / 1024.);// 可以使用的最大的記憶體量
    System.out.println(runtime.totalMemory() / 1024. / 1024.);// 已經使用的記憶體量

}

}

相關文章