面試題 2 設計模式

2021-10-19 23:25:18 字數 2267 閱讀 6765

:指乙個類只有乙個例項,且該類能自行建立這個例項的一種模式。例如,windows

中只能開啟乙個任務管理器,這樣可以避免因開啟多個任務管理器視窗而造成記憶體資源的浪費,或出現各個視窗顯示內容的不一致等錯誤。

通過提供乙個靜態的物件instance,利用private許可權的構造方法和getinstance()方法來給予訪問者乙個單例。

缺點是,沒有考慮到執行緒安全,可能存在多個訪問者同時訪問,並同時構造了多個物件的問題。之所以叫做懶漢模式,主要是因為此種方法可以非常明顯的lazy

loading。 針對懶漢模式執行緒不安全的問題,我們自然想到了,在getinstance()方法前加鎖,於是就有了第二種實現。

如果不刪除這兩個關鍵字就能保證執行緒安全,但是每次訪問時都要同步,會影響效能,且消耗更多的資源,這是懶漢式單例的缺點。

}}

進行了兩次if (singleton == null)檢查,這樣就可以保證執行緒安全了。這樣,例項化**只用執行一次,後面再次訪問時,判斷if

(singleton == null),直接return例項化物件。 優點:執行緒安全;延遲載入;效率較高。

public

class

singleton

private

static

class

singletoninstance

public

static singleton getinstance()

}

類的靜態屬性只會在第一次載入類的時候初始化,所以在這裡,jvm幫助我們保證了執行緒的安全性,在類進行初始化時,別的執行緒是無法進入的。

優點:避免了執行緒不安全,延遲載入,效率高。

靜態**在使用時,需要定義介面或者父類,被**物件與**物件一起實現相同的介面或者是繼承相同父類.

可以做到在不修改目標物件的功能前提下,對目標功能擴充套件.因為**物件需要與目標物件實現一樣的介面,所以會有很多**類,類太多.同時,一旦介面增加方法,目標物件與**物件都要維護.

如何解決靜態**中的缺點呢?答案是可以使用動態**方式

動態**分為 基於jdk的動態**和cglib的 首先基於jdk的動態**:

目標物件要實現介面,但是**物件不需要,**物件是動態通過newproxyinstance方法生成的,方法裡面有三個引數,

他實現了invocationhandler並沖洗了 invoke 方法對目標方法進行增強

注意該方法是在proxy類中是靜態方法,且接收的三個引數依次為:

classloader loader:

指定當前目標物件使用類載入器,獲取載入器的方法是固定的

class> inte***ces,:

目標物件實現的介面的型別,使用泛型方式確認型別

invocationhandler h:

事件處理,執行目標物件的方法時,會觸發事件處理器的方法,會把當前執行目標物件的方法作為引數傳入

動態**:目標物件不需要實現介面,**物件是繼承目標類,通過enhancer.create()產生,然後對對目標物件進行增強當需要使用目標物件時,只需要呼叫**物件就可以完成。它用於解決無介面的**問題

原型模式(prototype

pattern)是用於建立重複的物件,同時又能保證效能。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。

這種模式是實現了乙個原型介面,該介面用於建立當前物件的轉殖。當直接建立物件的代價比較大時,則採用這種模式。例如,乙個物件需要在乙個高代價的資料庫操作之後被建立。我們可以快取該物件,在下乙個請求時返回它的轉殖,在需要的時候更新資料庫,以此來減少資料庫呼叫。

設計模式面試題

參考 常用的設計模式彙總,超詳細!這個模式本身很簡單而且使用在業務較簡單的情況下。一般用於小專案或者具體產品很少擴充套件的情況 這樣工廠類才不用經常更改 它由三種角色組成 來用類圖來清晰的表示下的它們之間的關係 抽象工廠模式 先來認識下什麼是產品族 位於不同產品等級結構中,功能相關聯的產品組成的家族...

Java面試題 設計模式

單例模式 保證被建立一次,節省系統開銷。工廠模式 簡單工廠 抽象工廠 解耦 觀察者模式 定義了物件之間的一對多的依賴,這樣一來,當乙個物件改變時,它的所有的依賴者都會收到通知並 自動更新。外觀模式 提供乙個統一的介面,用來訪問子系統中的一群介面,外觀定義了乙個高層的介面,讓子系統更容易使 用。模版方...

單例設計模式 面試題

設計模式 必須對於多個程式使用同乙個配置資訊物件時,就需要保證其物件的唯一性 如何保證物件的唯一性 不允許其程式new建立物件 在該程式中建立乙個本類例項 對外提供乙個方法讓其他方法可以獲取該物件 2.步驟 私有化該 建構函式 通過new建立乙個在本類物件 定義乙個公有的方法,將建立物件返回.pub...