秋招突擊——設計模式補充——單例模式、依賴倒轉原則、工廠方法模式

文章目錄

    • 引言
    • 正文
      • 依賴倒轉原則
      • 工廠方法模式
        • 工廠模式的實現
        • 簡單工廠和工廠方法的對比
      • 抽線工廠模式
        • 最基本的數據訪問程序
        • 使用工廠模式實現數據庫的訪問
        • 使用抽象工廠模式的數據訪問程序
        • 抽象工廠模式的優點和缺點
        • 使用反射+抽象工廠的數據訪問程序
        • 使用反射+配置文件實現數據訪問程序
      • 單例模式
        • 單例模式
        • 多線程時的單例
        • 雙重鎖定
        • 靜態初始化方法
      • 面試八股
    • 總結

引言

  • 躊躇了差不多半天吧,上午寫算法一直到一點半,然后的簡單做了個飯 ,吃了個飯,兩點半了,然后睡了一覺。起來三點鐘了,背了二十分鐘書,出去拿快遞,現在已經四點鐘了,才開始一天的工作的,后續還有兩件大事,不行,得加快進度。
  • 每天哪里在浪費時間呀,早上應該直接把衣服丟到洗衣機里面,然后開始背書,書背完了,直接就能去晾衣服了,然后刷算法那,然后開始補充自己的基礎知識。
  • 明天再快點好嘛!加油,兄弟,不然照這個進度下去,鐵定是要完蛋的。

正文

依賴倒轉原則

  • 原話:抽象不應該依賴細節,細節應該依賴于抽象的
    • 針對接口編程,不要堆實現編程
    • 高層模塊不應該依賴低層模塊,兩個都應該依賴抽象

補充—— 里氏代換原則

  • 子類必須能夠替換掉他們的父類型
  • 只有當子類可以替換掉父類,軟件單位的功能不受到影響時,父類才能真正的被復用,而子類也可以在父類的基礎上增加新的行為
  • 由于子類型的可替換性,才使得父類類型的模塊在無需修改的情況下,就可以擴展

本質

  • 依賴倒轉是面向對象設計的標志,編寫程序時考慮的是如何針對抽象編程,而不是針對細節編程。
    • 程序中所有的依賴關系都終止于抽象類或者接口,這就是面向對象設計

工廠方法模式

對比簡單工廠的實例

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

  • 簡單工廠類接受一個標記或者說字符串,然后給出創建好的實例對象,實現對應的功能。
工廠模式的實現
  • 下述是工廠類實現的UML圖,感覺比較難懂,沒看懂

在這里插入圖片描述

  • 對應實現代碼
    在這里插入圖片描述
  • 加減乘除各建一個具體工廠去實現接口,這些不同運算符的工廠是依賴于具體運算對象

在這里插入圖片描述

  • 客戶端實現的方式,通過創建一個加法工廠,然后通過加法工廠,獲取對應加法操作對象實例,進行對應操作

在這里插入圖片描述

簡單工廠和工廠方法的對比

簡單工廠

  • 簡單工廠模式的最大優點在于工廠類中包含了必要的邏輯判斷,根據客戶端的選擇條件動態實例化相關的類,對于客戶端來說,去除了與具體產品的依賴
    • 如果要對簡單工廠類的相關功能進行擴展,除了需要增加相關的操作類,還需要修改工廠類的邏輯
    • 違背了:修改封閉的原則,雖然遵循了開放擴展的原則。

工廠模式

  • 定義一個用于創建對象的接口,讓子類決定實例化哪一個類
    • 工廠方法使一個類的實例化延遲到其子類

在這里插入圖片描述

  • 在上面的代碼中,這個product就是一個operation對象,然后具體對應到功能,就是返回一個對應的operation子類的對象
  • 根據依賴倒轉原則
    • 把工廠類抽象出一個接口,這個接口只有一個方法,就是創建抽象產品的工廠方法
    • 所有要生產具體類的工廠,都去實現這個接口。
    • 如果要擴展新的功能,就只需要繼承并實現對應的工廠抽象類
      在這里插入圖片描述

將簡單工廠模式的工廠類,變成一個工廠抽象接口和多個具體生成對象的工廠,擴展只需要的增加方法類和具體工廠類即可
特點:

  • 工廠模式將簡單工廠的內部邏輯判斷,移到了客戶端代碼來進行

總結

  • 工廠方法克服了簡單工廠違背開放-封閉原則的缺點,保持了封裝對象創建過程的優點
  • 但是并不是最佳,還需要修改客戶端的代碼,通過反射可以進一步修改

抽線工廠模式

最基本的數據訪問程序

在這里插入圖片描述
在這里插入圖片描述

  • 上述程序的問題
    • SqlServer這個具體的數據庫對象和用戶端高度綁定,如果更換數據庫為access,需要修改大量內容,包括客戶端的代碼已經對應的get方法和insert方法
使用工廠模式實現數據庫的訪問
  • 這里為了降低耦合度,將數據庫訪問方式和用戶端開發進行分離,所以使用工廠方法實現

在這里插入圖片描述

  • 上述是定義了user訪問的接口,然后針對不同的數據庫定義不同的接口訪問類

在這里插入圖片描述
在這里插入圖片描述

  • 上述是具體的產品類,然后定義相關產品的具體工廠對象

在這里插入圖片描述

  • 客戶端只需要根據要求創建對應具體工廠實現類即可。

在這里插入圖片描述
在這里插入圖片描述

  • 通過上述方式實現業務邏輯和數據訪問的解耦,IUser對象就不需要具體知道是什么實現了數據庫訪問,但是能夠很好地完成工作。
使用抽象工廠模式的數據訪問程序
  • 提供一個創建一系列相關或者相互依賴對象的接口,而無需執行他們具體的類(比起工廠方法,抽象工廠就是涉及到多個product類)

在這里插入圖片描述

  • 針對上述方法抽象工廠模式,用戶端在具體使用的時候,創建具體產品類的工廠的concreteFactory,然后通過該具體工廠對象獲取對應的產品類productB1和productA1等,實現具體的功能
抽象工廠模式的優點和缺點
  • 易于交換產品系列

    • 一個具體的工廠類只需要在初始化的時候出現一次就行,改變一個應用具體的實現類(使用不同的數據庫)十分容易,只需要改變具體的工廠就行。
    • 既然不能防止需求改變,那就想方設法讓需求改變帶來的改動最小。
  • 讓具體的創建實例過程和客戶端分離

    • 客戶端通過抽象接口操作實例,產品的具體類名也被具體的工廠實現分離,不會出現在再客戶端你代碼中

在這里插入圖片描述

缺點

  • 新增加一個表,需要改的代碼太多了,抽象的工廠類以及每一個具體的類,還有對應表格映射類
  • 始終無法做到只修改一行語句,就實現替換對應的工廠類
    • 上述客戶端代碼中如果調用了100次new SqlFactory,那么你每一次修改對應的數據庫,都要修改一百次這樣的語句。
使用反射+抽象工廠的數據訪問程序
  • 依賴注入(Dependency Injection)和IoC容器管理

反射就是使用字符串變量替換了原來的生成對象的語句,所以以后一旦要修改使用的具體產品工廠,只需要修改這個字符串變量,不需要寫對應生成對象的語句,而通過設置配置文件或者全局變量,能夠實現只改變一個變量值,替換所有的數據庫

在這里插入圖片描述

  • 上述是兩種不同的創建工廠的方式,一種是常規方式,另外一種是使用了反射機制,通過字符串變量名來加載對應的工廠實例
    在這里插入圖片描述

在這里插入圖片描述

  • 修改為對應oracle數據訪問,就只需要修改對應的變量就行了
    在這里插入圖片描述
使用反射+配置文件實現數據訪問程序

在這里插入圖片描述

  • 在簡單工廠中使用反射機制來去除switch和if等條件分支語句,降低程序的耦合度。

單例模式

  • 將類的構造方法聲明為private,讓外界無法訪問他,也就沒有辦法構造對應的實例,再寫一個共有的方法,調用私有的構造方法,在公有的方法中對類是否存在進行判定。

在這里插入圖片描述

在這里插入圖片描述

單例模式
  • 保證一個類僅有一個實例,并提供一個訪問它的全局訪問點
    • 主要是讓類自身負責保護他的唯一實例,這個類可以保證沒有其他實例可以被創建
    • 提供一個訪問該實例的方法

在這里插入圖片描述
在這里插入圖片描述

  • 客戶端代碼
    在這里插入圖片描述
    好處
  • 保證唯一的實例
  • 單例模式封裝他唯一的實例,可以嚴格控制客戶怎么樣訪問它以及何時訪問它
    • 對唯一實例的受控訪問
多線程時的單例
  • 多個線程同時訪問單例時,會創建多個實例,需要加鎖控制
    在這里插入圖片描述
  • 因為會有多個線程同時通過判定語句,創建多個實例對象,因為對象不一定存在,所以要額外創建一個實例對象鎖。
  • 上述方法有問題,就是每一訪問,都需要經歷一次鎖,降低了并發度,影響了性能。
雙重鎖定

在這里插入圖片描述

  • 使用這種方法只有實例不存在的時候,才會進行加鎖判定。
靜態初始化方法
  • 在類 加載的過程中,就創建了對應的實例,不用再調用的才創建實例
    在這里插入圖片描述

  • 餓漢式單例類

    • 只有類在被加載的時候,才會將自己實例化,一開始創建的時候就實例化,不需要調用才實例化
    • 靜態初始化方法,隨著類的加載而創建實例,提前占用系統資源,
  • 懶漢式單例類

    • 要在第一次被引用的時候,才會將自己實例化。
    • 不會提前占用系統資源

面試八股

說一說簡單工廠模式

在這里插入圖片描述
在這里插入圖片描述

工廠方法模式了解嗎

在這里插入圖片描述

抽象工廠模式了解嗎

在這里插入圖片描述
在這里插入圖片描述

什么是單例模式?單例模式的特點是什么?
在這里插入圖片描述

單例模式的常見寫法有哪些

在這里插入圖片描述
在這里插入圖片描述

總結

  • 簡單工廠模式和工廠模式看了一下,發現確實能夠降低代碼開發耦合度,以前打比賽的時候,就應該使用這種方法進行開發,不然每一次都需要的給隊友好好講一下代碼的邏輯,他要什么,我再給他一個創建一個對象或者接口,最后代碼差不多有三千多行,沒有意義。
  • 今天終于看完了單例模式和工廠模式以及抽象工廠模式,想想當初面試騰訊的時候,我真的是再胡扯蛋,連基本的單例模式都不知道。真的是無語。過不了也是正常地,有沒有項目,然后最基本的一些知識點也過不了,難怪哈。
  • 題目大概就截了圖,明天早上趕早,背一下題目。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/39740.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/39740.shtml
英文地址,請注明出處:http://en.pswp.cn/web/39740.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

檢索增強生成RAG系列6--RAG提升之查詢結構化(Query Construction)

系列5中講到會講解3個方面RAG的提升,它們可能與RAG的準確率有關系,但是更多的它們是有其它用途。本期來講解第二部分:查詢結構化(Query Construction)。在系列3文檔處理中,我們著重講解了文檔解析&#xff…

C++ dll導出類的方法

要在C動態庫中導出類,可以使用以下步驟: 定義一個類并實現其成員函數。在類的聲明前加上__declspec(dllexport)標記(Windows平臺)或__attribute__((visibility("default")))標記(Linux平臺)&…

C語言學習筆記--第一個程序

第一個C語言程序 #include<stdio.h> //引用輸入輸出頭文件&#xff0c;每一次都需要引用這個文件 //.h是頭文件 // .c是源文件 // .cpp是C源文件&#xff0c;兼容C //C的第一個程序 // 行注釋&#xff08;只能注釋這一行&#xff09; /*塊注釋 */ int main() {printf(&…

能保存到相冊的風景視頻在哪下載?下載風景視頻網站分享

在當今以視覺為核心的時代&#xff0c;高清美麗的風景視頻不僅能夠豐富我們的日常生活&#xff0c;還能提供心靈上的慰藉。無論是為了制作視頻項目&#xff0c;還是僅僅想要珍藏一些精美的風景畫面&#xff0c;獲取高質量的風景視頻素材顯得尤為重要。許多人可能會問&#xff1…

PTrade量化軟件常見問題整理系列2

一、研究界面使用get_fundamentals函數報錯&#xff1a;error_info:獲取token失敗&#xff1f; 研究界面使用get_fundamentals函數報錯&#xff1a;error_info:獲取token失敗&#xff1f; 1、測試版本202202.01.052&#xff0c;升級202202.01.051版本后&#xff0c;為了解決不…

在虛擬仿真中學習人工智能,可以達到什么目標?

人工智能已經成為引領社會創新的關鍵力量&#xff0c;想要在這個充滿機遇的領域中脫穎而出&#xff0c;掌握扎實的專業技能和積累豐富的實踐經驗至關重要。然而&#xff0c;許多學習者在追求這一目標的過程中面臨著幾個主要問題&#xff1a;專業技術掌握有難度、實踐經驗積累存…

linux中awk,sed, grep使用

《linux私房菜》這本書中將sed和awk一同歸為行的修改這一點&#xff0c;雖然對&#xff0c;但不利于實際處理問題時的思考。因為這樣的話&#xff0c;當我們實際處理問題時&#xff0c;遇到比如說統計文本打印內容時&#xff0c;我們選擇sed還是awk進行處理呢&#xff1f; 也因…

?香橙派AIpro測評:usb魚眼攝像頭的Camera圖像獲取

一、前言 近期收到了一塊受到業界人士關注的開發板"香橙派AIpro",因為這塊板子具有極高的性價比&#xff0c;同時還可以兼容ubuntu、安卓等多種操作系統&#xff0c;今天博主便要在一塊832g的香橙派AI香橙派AIpro進行YoloV5s算法的部署并使用一個外接的魚眼USB攝像頭…

React 中如何使用 Monaco

Monaco 是微軟開源的一個編輯器&#xff0c;VSCode 也是基于 Monaco 進行開發的。如果在 React 中如何使用 Monaco&#xff0c;本文將介紹如何在 React 中引入 Monaco。 安裝 React 依賴 yarn add react-app-rewired --dev yarn add monaco-editor-webpack-plugin --dev yarn…

學習和發展人工智能:新興趨勢和成功秘訣

人工智能(AI)繼續吸引組織&#xff0c;因為它似乎無窮無盡地提高生產力和業務成果。在本博客中&#xff0c;了解學習和發展(L&D)部門如何利用人工智能改進流程&#xff0c;簡化工作流程&#xff1f; 學習與發展(L&D)部門領導開始探索如何提高和支持人工智能能力的勞動…

1-認識網絡爬蟲

1.什么是網絡爬蟲 ? 網絡爬蟲&#xff08;Web Crawler&#xff09;又稱網絡蜘蛛、網絡機器人&#xff0c;它是一種按照一定規則&#xff0c;自動瀏覽萬維網的程序或腳本。通俗地講&#xff0c;網絡爬蟲就是一個模擬真人瀏覽萬維網行為的程序&#xff0c;這個程序可以代替真人…

工業智能網關在現代工業生產中的重要性-天拓四方

工業智能網關是一款具備挖掘工業設備數據并接入到自主開發的云平臺的智能嵌入式網絡設備。它具備數據采集、協議解析、邊緣計算&#xff0c;以及4G/5G/WiFi數據傳輸等功能&#xff0c;并能接入工業云平臺。這種網關不僅支持采集PLC、傳感器、儀器儀表和各種控制器&#xff0c;還…

iss文件本機可以訪問,其他電腦無法訪問解決

1.搜索的時候有很多答案&#xff0c;總結就是2種 引用來自這位大佬的博客跳轉 2.我實際解決了的方法 將這里的ip地址修改為你局域網wifi的ip 如何看自己wifi的ip&#xff0c;大家自行百度&#xff01;

linux中與網絡有關的命令

本文的命令總覽 ifconfig命令 在 Linux 系統中&#xff0c;ifconfig 命令用于配置和顯示網絡接口的信息&#xff0c;包括 IP 地址、MAC 地址、網絡狀態等。同時我們也可以利用ifconfig 命令設置網絡接口對應的ip地址&#xff0c;子網掩碼等 當你使用 ifconfig 命令時&#xf…

06-6.3.3 圖的深度優先遍歷

&#x1f44b; Hi, I’m Beast Cheng &#x1f440; I’m interested in photography, hiking, landscape… &#x1f331; I’m currently learning python, javascript, kotlin… &#x1f4eb; How to reach me --> 458290771qq.com 喜歡《數據結構》部分筆記的小伙伴可以…

UE5.4新功能 - Texture Graph上手簡介

TextureGraph是UE5.4還在實驗(Experimental)階段的新功能&#xff0c;該功能旨在材質生成方面達到類似Subtance Designer的效果&#xff0c;從而程序化的生成一些紋理。 本文就來簡要學習一下。 1.使用UE5.4或以上版本&#xff0c;激活TextureGraph插件 2.內容視圖中右鍵找到…

萬字 | 菊花廠C語言編程10大規范

本文是大廠C代碼規范&#xff0c;有點長&#xff0c;有時間可以學習下。 1 代碼總體原則 1、清晰第一 清晰性是易于維護、易于重構的程序必需具備的特征。代碼首先是給人讀的&#xff0c;好的代碼應當可以像文章一樣發聲朗誦出來。 目前軟件維護期成本占整個生命周期成本的…

【INTEL(ALTERA)】為什么Nios? II構建流程報告無法在 Windows WSL 上確定程序大小?

目錄 說明 解決方法 說明 由于英特爾 Quartus Prime 專業版軟件 19.3 版中的 nios2-elf-stackreport 實用程序出現問題&#xff0c;nios2-elf-stackreport 實用程序確實如此 不報告程序大小或堆棧堆棧大小。 解決方法 要解決此問題&#xff0c;編輯 nios2-stackreport.pl …

1)并發事務的問題

1) 并發事務的問題&#xff1f; &#xff08;1&#xff09;讀“臟”數據 事務T1修改數據后T2讀取了該數據&#xff0c;但是T1撤消了修改&#xff0c; 事務T1進行了回滾&#xff0c;導致事務T2讀取的數據與數據庫中的數據不一致。&#xff08;2&#xff09;丟失修改 兩個事務…

面向對象(Java)

構造方法只能在對象實例化的時候調用 this可以作為方法參數&#xff0c;表示調用方法的當前對象 this可以作為方法返回值&#xff0c;表示返回當前對象 封裝 通過方法訪問數據&#xff0c;隱藏類的實現細節 static&#xff1a;類對象共享&#xff0c;類加載時產生&#xff0c;…