面向對象設計原則
單一職責
每個類只有一個職責,并被完整的封裝在類中,該原則用來控制類的粒度。
例如Mapper,controller都只負責一個業務。
開閉原則
應該對擴展開放,而對修改封閉,例如定義接口或是抽象類作為抽象層,其具體層子類可以多種多樣。
里氏替換原則
子類只能擴展父類的功能,不能修改父類的功能。
依賴倒轉原則
高層不應該依賴于底層,而是應該依賴于抽象,防止代碼之間出現強關聯強耦合,因此在Spring框架中使用的是接口定義職責,這樣高層只需關注接口定義的方法,不用關心實現類,有框架自動管理。
接口隔離原則
接口的劃分應該注意粒度,不要讓一些類實現不必要的接口方法,如果出現一個實體類實現接口后,方法無意義,就應該進一步劃分接口
合成復用原則
如果需要復用某個類的功能,優先考慮將其引入本類內部作為類的內部成員或是作為參數傳入,而不是去繼承,進一步降低耦合度,也防止A的實現細節暴露導致不安全。
迪米特原則(最小知識原則)
每個類或模塊應該對其他類有著最小的知識或是最小的交互,降低耦合度。
創建型設計模式
工廠方法模式
如果直接使用new方式進行創建對象,不僅麻煩一旦出現改動,可能導致需要修改大量代碼,如果使用工廠模式,由工廠進行創建則只需要修改工程中的代碼即可,同時有些對象的創建可能需要參數,不是簡單new即可。
簡單工廠模式(不符合開閉原則),如果增加類,則需要修改工廠方法。
因此改進為工廠方法模型,將生產實體類作為一種職責,變化到抽象層,具體的實體類對應具體層實現。
抽象工廠模式
如果有多個個產品族,每個都創建一個工廠就不方便,因此直接創建一個抽象的頂層工廠,具體的產品族進行不同的實現,但是缺點在于違背了開閉原則,如果產品族中新增產品就需要修改抽象層。
建造者模式
建立一個Builder類,對需要創建的對象進行配置,最后在創建,注重的是一步一步配置的過程,且構造方法參數過多時應該使用,此時應該將類的全參構造方法設為私有,用建造者類進行配置
builder自身也應該保存參數,支持鏈式調用,build()處進行調用全參構造方法傳入設定好的所有參數。
單例模式
就是只用一個實例的情況下,無需創建太多實體對象,使用一個或者靜態方法就能滿足需求。
餓漢
懶漢式(懶加載)
線程不安全,可能導致創建多個對象。
加鎖版本,加鎖后應該還要判斷,否則可能有多個線程都已經判空并在等鎖,導致創建多次
還需要再INSTANCE上加上volatile,以保證該對象在線程中的可見性
最優解是使用另一個靜態內部類持有實例對象,既延遲加載又線程安全。
原型模式
使用原型對象進行拷貝生成新的對象(深拷貝),不能直接使用Java的拷貝方法,而是應該重寫實現深拷貝,