Java 中的抽象與接口

抽象方法和抽象類(abstract)

  1. 抽象方法和抽象類使用 abstract 來定義,有抽象方法的類必須被定義為抽象類,抽象類里可以沒有抽象方法;
  2. 抽象方法:只有方法簽名,沒有方法體的方法;
  3. 抽象類不能被實例化,也就是不能通過new關鍵字去產生對象,只能被繼承,但是可以定義變量,任何繼承了抽象類的非抽象類的對象可以給這個變量賦值;
  4. 抽象類的子類必須實現抽象類里的所有抽象方法,否則這個子類還是抽象類;
  5. 抽象類可以包含成員變量、方法(普通方法和抽象方法)、構造器(并不用于創建對象,而是讓子類調用,從而完成屬于抽象類的初始化操作)、初始化塊、內部類(接口、枚舉)。

抽象類的作用

抽象類是從多個具有相同特征的具體類中抽象出來的父類,以這個父類作為子類的模板,可以避免子類設計的隨意性。

模板方法模式(Template Method)

1. 模板方法模式是由抽象父類控制頂級邏輯,并把某些操作的實現推遲到子類去實現。 
2. 如果編寫一個抽象父類,父類將部分邏輯以具體方法以及具體構造函數的形式實現,并把不能實現的部分抽成抽象方法,留給其子類去實現,不同的子類可以以不同的方式實現這些抽象方法,從而對剩余的邏輯有不同的實現,這種模式就叫模板方法模式。

具體例子:

SpeedMeter - class

上面定義了一個抽象的SpeedMeter類,用來計算車速。該類定義了兩個子類通用的方法——設置轉速的方法setTurnRate()和計算車速的方法getSpeed(),getSpeed()方法需要知道車輪的半徑,但SpeedMeter并不知道車輪的半徑,所以將其抽象成抽象方法,交由子類來實現。

CarSpeedMeter - class
BicycleSpeedMeter - class

上面定義了CarSpeedMeter類和BicycleSpeedMeter類,它們均繼承自SpeedMeter類,并實現了其父類中的抽象方法getRadius(),其中CarSpeedMeter類的半徑是0.31m,BicycleSpeedMeter類的半徑是0.33m。

Test - class

上面定義了一個測試類,分別創建了CarSpeedMeter類和BicycleSpeedMeter類的對象,并分別設置它們的轉速,最后打印它們各自的車速。

運行結果:

Result

模板方法模式(Template Method)的應用場景

  • 具有統一的操作步驟或操作過程
  • 具有不同的操作細節
  • 存在多個具有同樣操作步驟的應用場景,但某些具體的操作細節卻各不相同

接口(interface)

  1. 接口里可以包含成員變量、方法、內部類(包括內部接口和枚舉),不能有構造器和初始化塊;
  2. 接口里的成員變量必須初始化(即必須賦初值),且均為靜態常量(即此值一旦賦值便不能再更改,系統會自動為成員變量添加static和final修飾符,故可以省略);
  3. 接口里的方法只能為抽象方法(沒有方法體)、類方法(必須使用static修飾,有方法體,Java 8及以上版本支持)、默認方法(必須使用default修飾,有方法體,Java 8及以上版本支持);
  4. 一個接口可以從多個接口得到繼承(即接口允許多繼承,類只能單繼承),但不允許接口從類得到繼承(即接口只能繼承接口);
  5. 接口不能被實例化。

接口的語法格式

[修飾符] interface 接口名 { 定義零到多個常量... 定義零到多個抽象方法... 定義零到多個內部類、接口、枚舉... 定義零到多個默認方法、類方法(Java 8+)... }
??修飾符可以是public或者省略,省略的話默認為default(即包權限)。

接口的用途

  • 定義變量,也可以用于進行強制類型轉換
  • 調用接口中定義的常量
  • 被其它類實現

實現接口

1. 一個類只能繼承一個類,但可以實現(implements)一個或多個接口(即單繼承,多實現);
2. 一個類實現接口后,必須實現接口里的所有抽象方法,否則這個類就成為一個抽象類。

簡單工廠模式(Simple Factory Pattern)

1. 簡單工廠模式,又叫靜態工廠方法(Static Factory Method)模式;
2. 簡單工廠模式是由一個工廠對象根據傳入的參數,動態地決定創建出哪一種產品類的實例(這產品類往往繼承自同一個父類或實現了同一個接口)。

簡單工廠模式包含的角色及職責

工廠(Creator)角色
??簡單工廠模式的核心,它負責實現創建所有實例的內部邏輯。工廠類創建產品類的方法可以被外界直接調用,創建所需的產品對象。
抽象產品(Product)角色
??簡單工廠模式所創建的所有對象的父類(父類可以是接口或抽象類),它負責描述所有實例所共有的公共接口。
具體產品(Concrete Product)角色
??簡單工廠模式所創建的具體實例對象。

具體例子:

Printer - interface

上面定義了一個Printer接口,在其內部定義了三個抽象方法。

HPPrinter - class

上面定義了一個HPPrinter類,其實現了Printer接口并重寫了Printer接口的全部抽象方法。

CanonPrinter - class

上面定義了一個CanonPrinter 類,其實現了Printer接口并重寫了Printer接口的全部抽象方法。

PrinterFactory - class

上面定義了一個PrinterFactory類,其有一個返回值類型為Printer的靜態方法,根據用戶傳入的不同參數創建不同的實例。

Test - class

上面定義了一個測試類,用來測試程序。

運行結果:

Result 1
Result 2

從上面的運行結果可以看到,當用戶輸入不同的參數時,會得到不同的打印機。

簡單工廠模式的優缺點

優點:
??工廠類是整個模式的關鍵所在。它包含必要的判斷邏輯,能夠根據外界給定的信息,決定究竟應該創建哪個具體類的對象。用戶在使用時可以直接根據工廠類去創建所需的實例,而無需了解這些對象是如何創建以及如何組織的。這有利于整個軟件體系結構的優化。
缺點:
??由于工廠類集中了所有實例的創建邏輯,將全部創建邏輯集中到了一個工廠類中,導致沒有很高的內聚性;同時,工廠類違反了開閉原則,它所能創建的類只能是事先考慮到的,如果需要添加新的類,那就需要改變工廠類了。


參考資料:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,197評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,415評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,104評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,884評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,647評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,130評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,208評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,366評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,887評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,737評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,939評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,478評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,174評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,586評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,827評論 1 283
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,608評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,914評論 2 372

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,714評論 18 399
  • 原文鏈接:http://blog.csdn.net/zhangerqing http://www.cnblogs....
    孤獨雜貨鋪閱讀 1,526評論 0 3
  • 一、設計模式的分類 總體來說設計模式分為三大類: 創建型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者...
    lichengjin閱讀 904評論 0 8
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,781評論 18 139
  • 文/谷穗風致 奶奶去逝那年,我隨父親回老家奔喪。 生前,奶奶一直獨居在老家圍龍屋村里的一間小泥磚單間。鄉下最親的人...
    谷穗風致Echo閱讀 973評論 37 37