關于單例模式
1.什么是單例模式?
答:
單例模式是一種創建型設計模式,確保一個類在運行期間僅有一個實例,提供全局唯一的訪問點
2.單例模式的目的?
答:
避免重復創建資源消耗大的對象,例如日志系統、線程池、連接池等
統一管理全局共享狀態或資源、例如配置管理器
確保實例在程序結束時正確銷毀,避免資源泄露
總結:避免重復創建資源大的對象、統一管理一些資源、確保銷毀
3.在日志系統中,為什么用到了單例模式?全局變量不行嗎?
答:
在這個日志系統中,支持多個日志器存在,你可以創建建造者類的接口創建多個日志器,每個日志器可以設置自己的輸出方向和日志格式,通過單例模式建造一個日志器管理類,每當創建一個日志器后都會放入這一個全局單例類中進行管理,可以通過單例類中的接口根據日志器名稱來獲取你想要的日志器,然后進行輸出打印,通過單例模式減少了頻繁創建的問題,任何模塊都可以通過這個全局管理類來獲取日志器
總結:為了讓日志器管理類全局只有一個,每個日志器創建出來后都會放入這個類中,全局都可以通過getinstance接口來訪問,全局變量很難保證其他代碼不會修改到它
4.用的懶漢模式還是餓漢模式?他倆的區別是什么?
答:
餓漢模式:在main函數執行前初始化、沒有線程安全問題、但是可能造成資源浪費
懶漢模式:在第一次使用的時候初始化、有線程安全問題、資源浪費情況小
5.單例模式為什么要禁用拷貝構造和賦值,如果不禁用會有什么風險
答:
防止通過拷貝和賦值創建新對象、破壞單例唯一性
如果不禁用,用戶可以通過A a = A::getinstance(); 創建副本
6.單例模式的生命周期和析構問題?
答:
餓漢模式:按照全局/靜態變量析構
懶漢模式:按照局部靜態變量析構
7.單例模式的優缺點與使用場景?
答:
優點:資源利用率高,減少重復創建和銷毀的開銷
缺點:懶漢模式線程安全
8.三種懶漢模式(非安全、安全、c++11)的性能對比?
答:
非安全:性能最快,無鎖開銷
安全:第一次初始化加鎖,其他時候不加鎖,性能還行
c++11:性能也還行、
9.c++11版本的原理?
答:
編譯器在生產代碼時,會為局部變量添加一個輔助標志位判斷是否被初始化
執行到代碼的時候判斷標志位,沒有被初始化就加鎖,已初始化就跳過,返回
關于工廠模式
10.日志系統中為什么用到了工廠模式,談談對工廠模式的理解?
答:
在日志落地模塊通過工廠模式來生產指定落地方式,通過工廠模式來進行擴展新落地方式
工廠模式是一種創建型設計模式、通過定義工廠類的接口,在接口內部返回指定的對象
解決了創建和使用耦合的問題,一旦對象的創建方式發生變化,僅需更改工廠模式
使擴展更方便
隱藏了創建的復雜邏輯細節,只返回對象
注意項:工廠模式返回對象盡量智能指針,不然使用完對象需要手動delete,不然內存泄漏
11.工廠模式跟建造者模式的關系?
答:
兩者都是創建型設計模式、都封裝了對象的創建過程
工廠模式專注于創建不同類型的產品,我要什么 工廠給我什么
建造者模式專注于如何一步步構建產品
12.工廠模式的分類及核心區別?
答:
簡單工廠模式:一個工廠類、新增產品需修改工廠
工廠方法模式:抽象一個工廠類,一個產品一個子工廠類
抽象工廠模式:抽象一個工廠類,一個產品類一個子工廠類
關于建造者模式
1.日志系統為什么使用建造者模式?談談你對建造者模式的理解
答:
在日志系統中的構建完整日志器、如日志器名稱、日志消息、等級、日志格式化器、同步/異步、落地方式 是通過建造者模式的,因為日志系統是兩種日志器:局部和全局,設置兩個建造者類來進行建造,我們只需要傳入對應參數,幫我們建造完返回給我們對象
建造者模式也是一種創建型設計模式,將復雜對象的構造過程統一
2.建造者模式的優缺點
答:
優點:解耦構造過程與產品表示,便于擴展(新增具體建造者類就可生成新對象)
精確控制對象的構建步驟,代碼可讀性高
缺點:增加了類的數量、如果產品結構更改 需要修改