
1.設計模式
設計模式:一套被反復使用、多數人知曉的,經過分類編目的、代碼設計經驗的總結,是軟件開發人員在軟件開發過程中面臨的一般問題的解決方案。
- 項目中合理的運用設計模式可以完美的解決很多問題;
- 每種模式在現實中都有相應的原理來與之對應;
- 每一個模式描述了一個在我們周圍不斷重復發生的問題,以及該問題的核心解決方案。
23種基礎模式
單例模式
要點:
- 某個類只能有一個實例;
- 必須自行創建實例;
- 必須自行向整個系統提供這個實例
實現:
- 只提供私有的構造方法;
- 含有一個該類的靜態私有對象;
- 提供一個靜態的公有方法用于創建、獲取靜態私有對象。
餓漢式:在創建類的同時實例化對象,以空間(內存中存在周期長)換時間(類加載比較快),線程比較安全
package com.imooc.singletonProj;
/*** 餓漢式:創建對象實例的時候直接初始化*/
public class SingletonOne {//1.私有構造方法private SingletonOne(){}//2.該類型私有靜態實例private static SingletonOne instance =new SingletonOne();//3.靜態共有方法用于創建、獲取靜態私有對象public static SingletonOne getInstance(){return instance;}
}
懶漢式:懶漢式:不直接創建靜態實例,而是在使用的時候調用靜態getter方法完成初始化,用時間換空間,存在線程風險
package com.imooc.singletonProj;
public class SingletonTwo {//1.私有構造方法private SingletonTwo(){}//2.該類型私有靜態實例private static SingletonTwo instance=null;//3.創建開放的靜態方法提供實例對象public static SingletonTwo getInstance(){if(instance==null)instance=new SingletonTwo();return instance;}
}
單例模式的優點:
- 在內存中只有一個對象,節省內存空間;
- 避免頻繁創建銷毀對象,提高性能;
- 避免對共享資源的多重占用
單例模式的缺點:
- 擴展困難;
- 如果實例化后的對象長期不利用,系統將默認為垃圾進行回收,造成對象狀態丟失
使用場景:
- 創建對象時占用資源過多,但同時又需要用到這類對象;
- 對系統內資源要求統一讀寫,如讀寫配置信息;
- 當多個實例存在可能引起程序邏輯錯誤,如號碼生成器。
說實話,以上的內容不是太懂,可能學的還是不夠深入
2.抽象(類、方法)
2.1 抽象類
如同之前的繼承中的例子,父類Animal可以進行實例化,并執行吃的行為
Animal pet=new Animal("花花",2)
pet.eat()
程序運行沒有問題,但是實際邏輯上應該是其子類(Cat or Dog)來執行對應的動物各自特殊的 吃的行為,因此使用 abstract
不允許實例化父類來避免寫出上述沒有意義的代碼。防止父類和無意義實例化和子類設計的隨意性,父類就是個 工具類(工具人)
抽象類應用場景:某個父類只是知道其子類應該包含怎樣的方法,但無法準確知道這些子類如何實現這些方法。
2.2 抽象方法
父類中的方法被子類重寫,因此父類的方法沒有用,需要用 abstract
修飾方法,稱之為 抽象方法,且沒有方法體。使其無法調用,并且要求子類重寫方法。否則,子類也需要成為抽象類才不用重寫。
抽象類和抽象方法的存在是提醒編寫者需要重寫父類有,但是需要子類的重寫的方法。
使用規則:
- abstract定義抽象類;
- 抽象類不能直接實例化,只能被繼
- 承,可以通過向上轉型完成對象實例化
- 包含抽象方法的必須是抽象類,但是抽象類可以沒有抽象方法;
- static final private 與abstract無法共存;
- 可以定義一個抽象類的對象變量,但是只能引用非抽象子類的對象,即向上轉型
Person p = new Strudent()
2.3 總結
抽象類禁止了父類被無效的實例化,而抽象方法則要求子類繼承后必須重寫(除非子類也是abstract),一代一代傳下去,誰真正繼承,誰重寫。
只有抽象方法才需要重寫,抽象類中的非抽象方法不需要重寫,這是抽象類與接口的不同的其中一點。
抽象類將 設計 與 實現 相分開,誰繼承,誰再具體實現,這就是抽象類存在的意義。