設計模式常見面試題

2021-10-03 18:53:24 字數 3319 閱讀 1173

設計模式一套被反覆使用,多數人知曉的**設計經驗的總結,實現可重用**,使**更容易被理解,保證**可靠性。

總體來說,設計模式分為三大類:

建立型模式(五種):工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式

結構型模式(七種):介面卡模式、裝飾器模式、**模式、外觀模式、橋接模式、組合模式、享元模式

行為型模式(十一種):策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、直譯器模式。

常見的設計模式介紹:

1、單例模式

意圖:保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。

主要解決:乙個全域性使用的類頻繁地建立與銷毀。

何時使用:當您想控制例項數目,節省系統資源的時候。

如何解決:判斷系統是否已經有這個單例,如果有則返回,如果沒有則建立。

關鍵**:建構函式是私有的。

應用例項: 1、乙個黨只能有乙個書記。 2、windows 是多程序多執行緒的,在操作乙個檔案的時候,就不可避免地出現多個程序或執行緒同時操作乙個檔案的現象,所以所有檔案的處理必須通過唯一的例項來進行。 3、一些裝置管理器常常設計為單例模式,比如乙個電腦有兩台印表機,在輸出的時候就要處理不能兩台印表機列印同乙個檔案。

優點: 1、在記憶體裡只有乙個例項,減少了記憶體的開銷,尤其是頻繁的建立和銷毀例項(比如管理學院首頁頁面快取)。 2、避免對資源的多重占用(比如寫檔案操作)。

缺點:沒有介面,不能繼承,與單一職責原則衝突,乙個類應該只關心內部邏輯,而不關心外面怎麼樣來例項化。

使用場景: 1、要求生產唯一序列號。 2、web 中的計數器,不用每次重新整理都在資料庫裡加一次,用單例先快取起來。 3、建立的乙個物件需要消耗的資源過多,比如 i/o 與資料庫的連線等。

注意事項:getinstance() 方法中需要使用同步鎖 synchronized (singleton.class) 防止多執行緒同時進入造成 instance 被多次例項化。

2、工廠模式

在工廠模式中,我們在建立物件時不會對客戶端暴露建立邏輯,並且是通過使用乙個共同的介面來指向新建立的物件。

意圖:定義乙個建立物件的介面,讓其子類自己決定例項化哪乙個工廠類,工廠模式使其建立過程延遲到子類進行。

主要解決:主要解決介面選擇的問題。

何時使用:我們明確地計畫不同條件下建立不同例項時。

如何解決:讓其子類實現工廠介面,返回的也是乙個抽象的產品。

關鍵**:建立過程在其子類執行。

3、抽象工廠模式

抽象工廠模式(abstract factory pattern)是圍繞乙個超級工廠建立其他工廠。該超級工廠又稱為其他工廠的工廠。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。

在抽象工廠模式中,介面是負責建立乙個相關物件的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式提供物件。

主要解決:主要解決介面選擇的問題。

何時使用:系統的產品有多於乙個的產品族,而系統只消費其中某一族的產品。

如何解決:在乙個產品族裡面,定義多個產品。

關鍵**:在乙個工廠裡聚合多個同類產品。

4、觀察者模式

當物件間存在一對多關係時,則使用觀察者模式(observer pattern)。比如,當乙個物件被修改時,則會自動通知它的依賴物件。觀察者模式屬於行為型模式。

意圖:定義物件間的一種一對多的依賴關係,當乙個物件的狀態發生改變時,所有依賴於它的物件都得到通知並被自動更新。

主要解決:乙個物件狀態改變給其他物件通知的問題,而且要考慮到易用和低耦合,保證高度的協作。

何時使用:乙個物件(目標物件)的狀態發生改變,所有的依賴物件(觀察者物件)都將得到通知,進行廣播通知。

如何解決:使用物件導向技術,可以將這種依賴關係弱化。

單例模式:  保證乙個類只有乙個例項 並且提供乙個訪問該例項的全域性訪問點

應用場景:比如說任務管理器,**站

優點:由於單例模式只生成乙個例項,減少了系統效能的開銷

單例模式可以再系統設定全域性的訪問點,優化共享資源訪問

餓漢式:

懶漢式:

簡單工廠模式:

工廠方法模式

抽象工廠模式:圍繞著乙個超級工廠生產其他工廠該超級工廠又被稱為其他工廠的工廠

1、單一職責原則

單一職責有2個含義,乙個是避免相同的職責分散到不同的類中,另乙個是避免乙個類承擔太多職責。減少類的耦合,提高類的復用性。

2、介面隔離原則

表明客戶端不應該被強迫實現一些他們不會使用的介面,應該把胖介面中額方法分組,然後用多個介面代替它,每個介面服務於乙個子模組。簡單說,就是使用多個專門的介面比使用單個介面好很多。

該原則觀點如下:

1)乙個類對另外乙個類的依賴性應當是建立在最小的介面上

2)客戶端程式不應該依賴它不需要的介面方法。

3、開放-封閉原則

open模組的行為必須是開放的、支援擴充套件的,而不是僵化的。

closed在對模組的功能進行擴充套件時,不應該影響或大規模影響已有的程式模組。一句話概括:乙個模組在擴充套件性方面應該是開放的而在更改性方面應該是封閉的。

核心思想就是對抽象程式設計,而不對具體程式設計。

4、替換原則

子型別必須能夠替換掉他們的父型別、並出現在父類能夠出現的任何地方。

主要針對繼承的設計原則

1)父類的方法都要在子類中實現或者重寫,並且派生類只實現其抽象類中生命的方法,而不應當給出多餘的,方法定義或實現。

2)在客戶端程式中只應該使用父類物件而不應當直接使用子類物件,這樣可以實現執行期間繫結。

5、依賴倒置原則

上層模組不應該依賴於下層模組,他們共同依賴於乙個抽象,即:父類不能依賴子類,他們都要依賴抽象類。

抽象不能依賴於具體,具體應該要依賴於抽象。

常見面試題

1.get和post的區別 1 本質區別 get是向伺服器請求資料,post是向伺服器傳送資料。2 伺服器獲取值的方式 get方式提交的資料,伺服器端使用request.querystring獲取變數的值。post方式提交的資料,伺服器端使用request.form獲取資料。3 安全性 get安全效...

常見面試題

1 一行 實現1 100之和 lst i for i in range 1,101 print sum lst 2 如何在乙個函式內部修改全域性變數?在函式內部新增 global 變數名 這樣就可以在本地作用域定義全域性作用域了 name 大明 def eat name1 global name n...

常見面試題

dns解析 發起tcp三次握手,並建立tcp連線 發起http請求 伺服器相應http請求並得到html 伺服器解析html 並對頁面進行渲染然後返回給使用者 首先先進行ioc容器的初始化 ioc 容器的初始化過程分為三步驟 resource 定位 beandefinition 的載入和解析,bea...