設計模式再學習(上)

2022-07-25 20:09:11 字數 3074 閱讀 2169

理解設計模式前的前堤:

1、模式的應用目標是把可維護性作為很重要指標的程式,像一次性的demo程式就不需要多高的可維護性;

2、意識到並認可面向介面程式設計的好處,不認可請回看1;

3、設計模式的本質是解耦,解耦的根本手段是分層,分的層越多,關係越不直觀;

4、不用設計模式完全不影響實現需求,只是寫的**多了,重構多了,寫著寫著,也就進入了設計模式的「窠臼」。

建立型模式

簡單工廠

算不是上設計模式,是一種常見的編碼模式。將new乙個物件例項的過程用乙個靜態的簡單工廠方法封裝起來,這樣client端不依賴於具體實現類impl,換實現類時只需要修改這個靜態方法一處即可,實現了初步的解耦。我認為在應用場景上,簡單工廠適合應用在條件固定的情況,比如性別,分類最多也就是:男、女、不詳,修改的概率基本沒有。另外反射的使用,也使得簡單工廠的可擴充套件性更強,例如:class.forname方法。

工廠方法

簡單工廠的缺點是是當需要增加新的實現類impl時,要修改靜態簡單工廠方法,即impl類與簡單工廠類的這個方法耦合了。試想一下如果你的簡單工廠方法用在簡單專案也就算了,如果你寫的是乙個框架,你讓呼叫方怎麼擴充套件?如果我讓不同的impl類依賴不同的工廠,那呼叫方要擴充套件的時候只需要加個impl類,加個對應的工廠類,由呼叫方決定呼叫不同的工廠產生例項,這就是工廠方法。

抽象工廠

工廠方法的乙個很明顯的缺點是工廠類太多了,如何組織合併這些工廠呢?比如小公尺生產膝上型電腦+手機,華為也生產膝上型電腦+手機,那按品牌分的話工廠有兩個,乙個是小公尺工廠,乙個是華為工廠。按產品分的話工廠有兩個,乙個是手機工廠,乙個是電腦工廠。一般認為產品是手機和筆記本、而小公尺還是華為,只是這個產品的某個屬性:品牌。所以抽象工廠應該是小公尺工廠和華為工廠,這兩個工廠分別有兩個方法,分別是生產膝上型電腦和生產手機。

單例模式

沒什麼好說的,寫過**的人都懂。值得一提的是spring ioc的controller、service、dao預設都是單例的。

原型模式

用過深拷貝的都懂。值得一提的是,我個人認為兩個不同型別的物件間相同名字的字段copy也算是原型模式的一種應用,比如beanutils.copyproperties。應用場景一般是通過從乙個原型裡copy出乙個另一新物件,然後增減相應字段形成目標物件。

建造者模式

用過jooq、mybatis generator或者activiti的應該對鏈式呼叫不陌生,其實鏈式呼叫用的就是建造者模式,只是director的職責由client端擔任了。

例如:new baseresponse.builder(1).setdata(data).setmessage("moext").build()

應用場景也很常見,就是有多個屬性,某些屬性可選的情況,當建構函式過載很多的時候就可以考慮用建造者模式重寫了,那些動不動就4個以上引數的建構函式對呼叫方來說是極不友好的。

結構型模式

介面卡模式

介面卡模式也是用得相對較多的一種模式,比如最常用的介面程式設計中dto到資料庫表實體entity之間的轉換,還各種協議轉換的編碼等。

享元模式

享元模式也是企業專案中必用的一種模式,各種池,比如執行緒池,連線池等都是享元模式的應用。

**模式

jdk自帶的**對介面生成**類,cglib的動態**更是直接用位元組碼增強的方式來實現,相比之下jdk自帶的**更符合**模式,一般情況下可以用**類對被**類進行增強,外部對被**類的訪問直接通過**類進行。

裝飾模式

裝飾者模式和**模式在結構上相似,但用處不同,裝飾者模式通過對原物件進行包裝,大多是裝飾鏈的應用,比如乙個毛坯房,通過水電裝飾、抹灰模式、刷漆模式、軟裝模式,最終達到精裝房的效果,在這個過程中毛坯房物件、硬裝房物件、精裝房物件都是可以訪問的,而**模式中,一般只可以通過訪問**物件達到訪問被**物件的效果。裝飾者模式在bio中被廣泛應用。這個模式在日常編碼中的應用需要結合建模,將原始模型通過一步步裝飾,達成目標模型,同時在每一步裝飾出來的物件都可以訪問。當然你愛用面向過程的方式,step by step的加裝飾效果也不是說不可以實現的,不用設計模式不影響實現需求的編碼。

外觀模式

通俗一點的例子就是汽車發動,對司機來說就是乙個open方法,而在內部,則有電力系統的open,燃油系統的open、動力系統的open等,由於司機並不關心汽車內部的發動細節,他只關注整個汽車有個統一的open方法。外觀模式在gui程式設計中直接應用得很多,在合適的建模下,其實日常應用中也可以有意識的運用,運用的關鍵在於使用者的角度看需不需要關注元件細節。

組合模式

組合模式先要將結構抽象成樹,比如檔案系統,按分類有:目錄,子目錄,檔案,首先需要抽象出節點的概念,這個節點可以是目錄、子目錄或檔案,然後形成樹狀結構。常見應用在組織架構、選單、檔案系統等樹狀結構中來表示部分與整體的層次關係。

橋接模式

就是在抽象部分與具體部分通過「橋」接起來,使兩個部分可以獨立變化而不互相影響。當你發現在程式設計中要考慮x*y笛卡爾積種情況的時候就可以考慮是否用橋接模式,比如咖啡容量有大、中、小杯,口味有:原味、加奶、加糖 三種,如果你用繼承來實現的話,有3 * 3=9種實現類。而用橋接模式,可以把容量定為的抽象部分,口味定為實現部分。咖啡類通過引用口味類達到給咖啡新增各類口味的效果。一杯加奶大杯咖啡就是 new largecoffee(new milk()); 可以看到,加口味時,只需要新增乙個口味實現,加容量時,需要加乙個容量實現類,口味和容量可以獨立地變化。那什麼情況下選擇抽象部分什麼情況下選擇實現部分呢?一般來說抽象部分是較穩定緯度或者是有限的客觀的事物,比如對電商公司來說:new phone(new huawei()),就比new huawei(new phone())更好,因為手機這個客觀的事物相對品牌而言會更加穩定。

下篇介紹行為型模式

設計模式 再學習

理解 原則 構造器模式 function user name age,career const user newuser name,age,career 簡單工廠模式 每個物件例項的變與不變 那麼使用工廠模式時,我們要做的就是去抽象不同建構函式 類 之間的變與不變 user 的 work 根據傳進來...

指標的學習 上)

include include using namespace std intmain int argc,char ar int main int argc,char ar include include using namespace std intmain int argc,char ar in...

2021 02 06機器學習(上)

人工智慧 機器學習 深度學習 機器學習領域 自然語言處理 影象識別 傳統 框架 tensorflow caffe theano 一 機器學習 1.概念 從資料中自動分析獲得規律,並利用規律對未知資料進行 2.機器學習的資料 檔案csv mysql 1.效能瓶頸 讀取速度 2.格式不太符合機器學習要求...