創建型設計模式對比總結 設計模式(八)

来源:https://www.cnblogs.com/noteless/archive/2018/11/22/9995954.html
-Advertisement-
Play Games

創建型設計模式是設計模式的入門基礎,主要包括工廠方法模式、抽象工廠模式、建造者模式、原型模式、單例模式,以及簡單工廠模式,本文對他們進行了分析對比,總結了創建型模式之間的區別聯繫 ...


  創建型模式是new 的一種替代方式,可以將對象的創建與具體的類型進行分離 目前已經介紹了5種創建型設計模式(如果簡單工廠算一種的話,那就是6種) 分別是: 簡單工廠模式、工廠方法模式、抽象工廠模式、建造者模式、原型模式、單例模式

簡單工廠模式


靜態工廠方法是一種最簡單的創建的替代方法 基本上不涉及複雜的處理過程,可能執行的僅僅是包裝、轉換等    比如,一個靜態方法,根據參數進行if else判斷,或者switch選擇進而確定需要創建的對象類型  比如,Long內部的valueOf 接受不同類型的參數,進而轉換為Long類型對象 他可以是一個方法,也可以有多個靜態方法 儘管通常簡單工廠模式將只會創建一種類型的產品對象 但是,你也可以N個靜態方法,創建N多種不同類型的對象 不過一般不這麼用,不夠清晰,沒有條理雜亂,完全不符合單一職責原則 所以對於簡單工廠模式,我們一般說簡單工廠模式只能創建一種類型的產品   簡單工廠模式它的核心就是: 一個類  靜態方法    來解決對象的創建問題 一個類吃遍天下

工廠方法模式


簡單工廠模式一個類吃遍天下,職責過多,就會有各種原因可能要修改這個類,好比你是兩個班級的班主任,不管哪個班級的學生有事情都要找你。 既不符合單一職責原則,也不符合開閉原則 所以為瞭解決這個問題,進化出來工廠方法模式   工廠方法模式不再是一個類吃遍天下 工廠方法模式通過與產品等級結構相同的工廠等級結構,對產品進行創建  每個工廠不再是多個職責,僅僅創建一種類型的產品,符合單一職責 而且,對於新增的產品等級,只需要擴展工廠,而不需要修改現有的工廠 所以說工廠方法模式是簡單工廠模式的標準版本,規範版本 工廠方法定義了一個用於創建對象的介面,他的子類(具體的工廠類)負責具體產品的創建 這個抽象的工廠角色並不知道他所創建的對象的具體類型,因為是子類決定了具體類型 將創建對象的職責委托給了多個子類中的一個,所以也說工廠方法模式將對象的創建延遲到其子類 比如 Creator creator = new ConcreteCreator(); Product product= creator.create(); 客戶端通過creator.create()獲得產品 不用關心Creator具體的類型,也不知道Product具體的類型,都是面向抽象的編程 創建的產品的具體的類型完全是動態的根據creator的具體的類型ConcreteCreator決定的 所以工廠方法模式也叫做多態工廠模式

抽象工廠模式


工廠方法模式雖然解決了簡單工廠模式中的各種問題,進行了升級改良 但是 工廠模式只能創建一種類型的產品 因為工廠模式的頂級抽象角色規定了創建的協議 他只有一種返回類型 為瞭解決工廠方法只能創建一種類型的產品的弊端,又拓展出抽象工廠的模式 將工廠的創建能力拓展到產品族 也就是頂級的抽象角色中,可以創建一系列類型的產品 這一系列類型的產品中的一員(每種類型一個)就組成了一個產品族的概念 實際使用的時候,一定要註意,他們必須要有產品族的概念 如果你沒有產品族的概念,非要生搬硬套的組織在一起,比如一個工廠生產輪胎和CPU和熱水袋,他們之間使用時毫無關聯,必然不會符合單一職責原則  有了產品族的概念,而且這一族產品也很可能一起出現使用,才是抽象工廠模式最好的運用 當一個系統要由多個產品系列中的一個來配置時,典型的就是類似廠家替換這種場景,非常適合抽象工廠

建造者模式


在有了能夠生產一族產品的能力之後,比如可以生產 輪胎 發動機 那麼,就會有應用這一族產品的需求  對於這一族產品的運用,又可以將他們使用邏輯,也就是裝配邏輯進行分離,這個分離就是建造者模式 建造者模式僅僅關心構造一個完整複雜產品的步驟,而不關心生產細節 細節由具體的builder進行實現 builder就相當於抽象工廠模式中的Creator,只不過builder還要負責每一個步驟的裝配 建造者模式也通常藉助於抽象工廠模式來進行實現,就是Creator也負責最終產品的組裝交付

原型模式


原型模式類似與工廠模式 工廠模式是通過“創建” 來獲得對象 而原型模式則是通過“複製”來獲得對象 Java語言的機制---所有的類都繼承自Object,使得Java天然的支持原型模式 只需要實現Cloneable介面即可,另外按照你的需要看是否實現clone方法 而對於稍微複雜點的原型模式下 比如創建的原型對象數量不固定或者產品種類較多,不方便管理,還出現了 帶“管家”的原型模式 通過管理器這個管家對原型對象進行管理 他提供獲取對象的方法 原型模式是另一種視角的創建

單例模式


單例模式邏輯含義比較簡單,就是有些場景就是需要唯一的對象,或者說有些場景沒必要使用多個對象 保證類只有一個實例,並提供一個訪問他的全局訪問點 比如,原型模式中的管理器,除非特殊必要,否則他就應該是一個單例 再比如,windows的任務管理器 重點是實現的過程---如何保證的確只有一個對象被產生 這個全局唯一的訪問點往往又是簡單工廠模式---一個靜態方法提供

對比、聯繫、區別


本身作為創建型模式,他們必然擁有相同的特征--“創建”對象,只不過是側重點不同 而且各種類型模式之間,很難不發生點關係   最基本的共性就是都是用來創建對象,都是new的替代方法 簡單工廠、工廠方法、抽象工廠、建造者、原型都是創建對象 而單例除了第一次創建,其餘時候都是返回一個已經存在的對象 建造者模式又特別關註比較複雜的對象   簡單工廠模式、工廠方法模式、抽象工廠模式都是工廠模式的形態之一 工廠方法模式是簡單工廠模式的規範化與標準化擴展 如果只有一個具體工廠類,工廠方法模式自然可以改造成簡單工廠模式 抽象工廠模式是工廠模式中最為抽象和最具一般性的一種形態 抽象工廠經常通過工廠方法來實現 (也可以藉助於原型模式來實現,抽象工廠可以存儲一個被拷貝的原型對象的集合,然後返回產品的對象)   簡單工廠模式和工廠方法模式都是針對一個產品等級結構,而抽象工廠則可以生產多個等級結構的產品    建造者模式與抽象工廠模式都可以用來創建同時屬於幾個產品族的對象,也就是他們都可以創建複雜的對象 但是建造者模式進一步的對組裝過程進行了分離 抽象工廠模式中,每一次的工廠對象調用都會創建一個完整的產品對象 客戶端來決定到底如何處理這些產品,可以組裝為更大的產品,也可能不會  建造者模式則關註藉助於產品族的各個產品,一點點的構造出一個更為複雜的產品 而且,產品的組裝過程發生在建造者內部封裝起來 建造者模式重點在於組裝,複雜對象構建邏輯的分離 但是複雜對象的的每一個組成部分往往又都是工廠模式創建 創建者模式與工廠模式經常結合使用 建造者模式在最後一步返回一個完整的產品(一般都是複雜的) 抽象工廠模式則是立即返回每一個產品,具體的產品如何處理隨便你 所以說,建造者模式是抽象工廠模式在某種場景下的一種延伸拓展   單例模式保證只有一個對象,它提供了一個靜態方法用於獲取這個唯一的對象 所以說,單例模式使用了簡單工廠模式 不過提供工廠方法的這個類就是他自身,而且靜態方法返回的對象也是他自身,是自己的工廠   單例模式與其他創建型模式並不衝突也不矛盾 其他模式中的對象,也可以是單例的   創建型模式之間是相互發展,相互借鑒的,結合具體的情況,適用於不同的場合 工廠方法模式,抽象工廠模式是最基礎的創建,以代替new 達到對象的創建與使用的隔離 建造者模式把產品組裝為複雜的產品 原型模式是要求通過“複製”來創建,單例模式要求只能創建一個,是進一步的需求升級  
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • rem
    /** * @example 1rem=100px */!(function (doc, win) { var docEle = doc.documentElement, resizeEvent = 'orientationchange' in window ? 'orientationchange ...
  • 一定的需求情況下,無法使用小程式原生的 tabbar 的時候,需要自行實現一個和 tabbar 功能一模一樣的自製組件。 查閱了海量的博客和文檔之後,親自踩坑。總結了三種在不使用微信小程式原生 tabbar的情況下自製 tabbar 的方法。並說說這幾種方法各自的特色。 類 navigator 跳轉 ...
  • 這是我讀過的第一本網路的書,沒有壓力,書很不錯,理論與實踐相結合,雖然書中有些翻譯的不是很到位,但是如果真的理解了書中的內容,很容易就能揣測出書中這正表達的意思,翻譯問題也根本就不是問題了,很喜歡TCP講解那幾章,建議做網路編程相關的人都讀一下,超值! 需要學習的朋友可以通過網盤免費下載pdf版 ( ...
  • 題目如下: 答案是: function Foo() { getName = function () { alert (1); }; return this; } Foo.getName = function () { alert (2);}; Foo.prototype.getName = func ...
  • 博主之前做過移動端app嵌入網頁,與Android和IOS有交互,一直沒有時間分享過程。這裡不多說Android交互啦~很簡單,詳細瞭解IOS與h5的交互吧。 IOS不同語法和h5的交互所建立的JSBrige是不一樣的,但是大致思想是一樣。這裡粘出swift與h5交互創建JSBrige。 這是js部 ...
  • 轉載請註明出處:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。 【年末促銷】葡萄城 2018 歲末福利火熱放送中 原文出處:https://www.sitepoint.com/flexbox-css-flexible-box-layout/ 近幾年,CSS領域出現了一些復 ...
  • Vue雙向榜單的原理 大家都知道Vue採用的是MVVM的設計模式,採用數據驅動實現雙向綁定,不明白雙向綁定原理的需要先補充雙向綁定的知識,在watch的處理中將運用到Vue的雙向榜單原理,所以再次回顧一下: Vue的數據通過Object.defineProperty設置對象的get和set實現對象屬 ...
  • DOM的全稱是Document Object Model 文檔對象模型,DOM定義了表示和修改文檔所需的對象、這些對象的行為和屬性以及這些對象之間的關係。 DOM對象即為宿主對象,由瀏覽器廠商定義,用來操作html的css功能的一類對象和集合。不過瀏覽器廠商之間大部分都遵循w3c標準。 簡單來說,D... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...