Java基礎(chǔ)(3)——抽象類和單例設(shè)計模式

本節(jié)內(nèi)容

1.單例設(shè)計模式

2.抽象類實現(xiàn)模板設(shè)計模式

3.抽象類實現(xiàn)造房子

一、單例設(shè)計模式

1.設(shè)計模式:對經(jīng)常出現(xiàn)的軟件設(shè)計問題的成熟解決方案
2.單例設(shè)計模式:確保某一個類里面只有一個實例,而且自行實例化并向整個系統(tǒng)提供這個實例。對于那些比較耗內(nèi)存的類,只實例化一次可以大大提高性能,尤其是在移動開發(fā)中。保持程序運行的時候始終只有一個實例存在內(nèi)存中。
3.創(chuàng)建單例設(shè)計模式的步驟:①私有化所有的構(gòu)造方法,不讓外部自己去創(chuàng)建 ②給外部提供一個靜態(tài)方法,獲取當前類的對象 ③必須定義一個靜態(tài)成員變量來保存當前類唯一的一個對象 ④創(chuàng)建對象:(1)餓漢式:在定義靜態(tài)成員變量時,直接創(chuàng)建當前類的一個對象,進行賦值
   private static HttpOperation instance=new HttpOperation();
   public static HttpOperation getInstance(){
        return instance;
    }
(2)懶漢式:默認不創(chuàng)建,當調(diào)用時才會創(chuàng)建
   private static HttpOperation instance;
   public static HttpOperation getInstance(){
        if(instance==null){
            //加鎖
            synchronized (HttpOperation.class){
                if(instance==null){
                instance=new HttpOperation();
            }
        }
        return instance;
    }
為了防止創(chuàng)建兩個不同的對象,所以在①號判斷為空后,要先給它加把鎖,那么當另外一個②號過來以后就會被擋在鎖外。那么當前這個①號就創(chuàng)建對象,然后解鎖,最后在棧里成功創(chuàng)建了一個對象。等它解鎖了以后,②號就給自己加鎖,此時再判斷instance已經(jīng)不為空了,所以它就直接解鎖然后離開。
public class MyClass {
    public static void main(String[] args) {
      HttpOperation instance1= HttpOperation.getInstance();
      HttpOperation instance2=HttpOperation.getInstance();

      System.out.println(instance1);
      System.out.println(instance2);
    }
}
當我們使用單例設(shè)計模式的時候,它的顯示為
Day5.HttpOperation@2a139a55
Day5.HttpOperation@2a139a55
可以發(fā)現(xiàn),它們創(chuàng)建的是同一個對象

二、抽象類實現(xiàn)模板設(shè)計模式

1.模板設(shè)計模式概念:從多個具有相同特征的類中抽象出一個抽象類,以這個抽象類作為其子類的模板,從而避免了子類設(shè)計的隨意性,子類在抽象類的基礎(chǔ)上進行擴展、改造。
2.模板里面定義執(zhí)行的過程(有些功能可以自己實現(xiàn),有些可以子類實現(xiàn))
3.抽象類里面用abstract修飾,抽象類是指表達概念而無法構(gòu)造出實體的類,抽象函數(shù)是指表達概念而無法實現(xiàn)具體代碼的函數(shù)
4.抽象類不能被實例化,也就是抽象類不能制造對象。抽象類里面可以定義成員變量/方法,沒有實現(xiàn)的稱為抽象方法,必須使用abstract修飾,而且不能被實現(xiàn)。抽象方法不能實現(xiàn),只能在子類中實現(xiàn)
5.子類繼承于抽象類,要么子類實現(xiàn)抽象類里面的抽象方法(也就是要實現(xiàn)父類所有的抽象方法),如果不想實現(xiàn),可以將自己也變成抽象類(很少使用)
6.在子類中,必須含有在父類中聲明為抽象方法的方法,其他在父類中沒有聲明為抽象的方法,在子類中可以重寫
public class MainActivity extends Activity{
    //抽象方法必須實現(xiàn)
    @Override
    public void onCreate() {
        System.out.println("創(chuàng)建首頁的界面");
    }
   //子類可以重寫父類的方法
    @Override
    public void onResume() {
        System.out.println("界面啟動了,開始交互");
    }
}
7.抽象類和普通類的區(qū)別:抽象類不能實例化,普通類可以。抽象類里面可以有抽象方法(只聲明,不實現(xiàn)),普通類不行

三、抽象類實現(xiàn)造房子

1.定義一個抽象類,用抽象方法來實現(xiàn)房子的類型、顏色、材料。再寫一個普通方法,通過對象來調(diào)用這些抽象方法
public abstract class DrawMap {
    public void BuildHouse(){
        //造什么房子
        String Type= GetHouseType();
        //選擇顏色
        String Color= GetHouseColor();
        //材料
        String Material=GetHouseMaterial();

        System.out.println("即將使用"+Material+"造一個"+Color+"的"+Type);
    }

   public abstract String GetHouseType();
   public abstract String GetHouseColor();
   public abstract String GetHouseMaterial();
}
2.寫一個繼承于DrawMap的子類Worker,在這里面實現(xiàn)父類的抽象方法
public class Worker extends DrawMap {

    @Override
    public String GetHouseType() {
        return "鄉(xiāng)村小別墅";
    }

    @Override
    public String GetHouseColor() {
        return "花花綠綠,五顏六色";
    }

    @Override
    public String GetHouseMaterial() {
        return "鋼筋水泥";
    }
}
3.在主類里面創(chuàng)建一個Worker類的對象,再通過這個對象調(diào)用父類里的BuilderHouse方法
public class MyClass {
    public static void main(String[] args) {
        Worker xw =new Worker();
        xw.BuildHouse();
    }
}
4.結(jié)果顯示為:即將使用鋼筋水泥造一個花花綠綠,五顏六色的鄉(xiāng)村小別墅
這樣一個房子就造好了,OK,以上就是今天的全部內(nèi)容,good拜。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容