23種設計模式(持續輸出中)

一.設計模式的作用

設計模式是軟件從業人員長期總結出來用于解決特定問題的通用性框架,它提高了代碼的可維護性、可擴展性、可讀性以及復用性。

二.設計模式
1.工廠模式

工廠模式提供了創建對象的接口,而無需制定創建對象的具體類,工廠類封裝了具體類的創建過程,客戶端無需知道具體實現類只需要知道工廠類,通過工廠類來創建具體實現的類。

1).優缺點
優點:

(1).松耦合:無需知道子類具體創建過程,只需要關注工廠類。
(2).可擴展性:擴展性高,如果想增加一個產品,只需要增加子類對應的工廠類即可。

缺點:

每增加一個產品,就需要增加一個具體的類和對應的工廠類,可維護性并不高,增加了代碼復雜性。

2).應用場景

使用數據庫連接工廠類連接不同的數據庫,比如達夢、崖山等

3).類圖

在這里插入圖片描述

4).具體實現過程

(1).創建一個接口
在這里插入圖片描述
(2).創建實體類
在這里插入圖片描述

在這里插入圖片描述

(3).創建工廠類
在這里插入圖片描述
(4).根據類型調用工廠類連接數據庫
在這里插入圖片描述

2.抽象工廠模式

抽象工廠模式是圍繞一個超級工廠創建其他工廠,此超級工廠又稱為其他工廠的工廠,抽象工廠模式提供了一個接口,通過此接口及其具體實現類,可以將對象的創建與客戶端代碼分離,從而實現系統的松耦合。

1).優缺點
優點:

(1).保證產品族一致性:抽象工廠模式創建的產品族類都是同一類產品,客戶端使用此族類的產品的時候也都是使用此族類的產品。
(2).實現松耦合:客戶端代碼只需要通過抽象工廠接口創建產品無需知道產品具體實現代碼。
(3).有利于擴展:增加新的產品族類,只需要添加新的具體工廠和產品類即可。

缺點:

每次增加產品族類都要添加一個此族類的工廠代碼,還要添加此工廠的具體實現代碼,系統和代碼復雜性變高。

2).應用場景

比如格力和美的電器都會生產很多產品,空調、洗衣機、冰箱、熱水器等,這些都是產品族類。

3).組成

抽象工廠:一般為接口,聲明了創建產品對象的方法;
具體工廠:實現了抽象工廠,用于創建產品對象的具體類;
抽象產品:一般為接口或抽象類,聲明實現產品的公共方法,具體產品必須要實現此方法;
具體產品:實現了抽象產品;

4).類圖

在這里插入圖片描述

5).具體實現

(1).創建一個接口
在這里插入圖片描述
在這里插入圖片描述
(2).創建接口的實體類
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

(3).創建抽象工廠類
在這里插入圖片描述

(4).創建抽象工廠類的擴展實現類
在這里插入圖片描述
在這里插入圖片描述
(5).創建生成器
在這里插入圖片描述
(5).使用
在這里插入圖片描述

3.單例模式

單例模式確保一個類只有一個實例,單例模式還需要提供一個全局訪問方法

1).優缺點
優點:

(1).避免一個全局使用的類頻繁地創建與銷毀
(2).保證了全局狀態的一致性

缺點:

(1).過度使用單例可能導致全局狀態不可控

2).應用場景

獲取打印機去打印圖紙,可以使用單例模式去創建打印機;IP訪問次數計數等;

3).具體實現
public class Singleton {//實例私有private static Singleton instance;//構造方法私有private Singleton() {}//創建實例的方法公開,如果沒創建就創建實例,如果創建了就不在創建public static Singleton getInstance() {if (instance == null) {// 如果實例為空,則創建一個新實例instance = new Singleton();}return instance;}
}
4.建造者模式

建造者模式提供了一種允許用戶逐步設置各種屬性來構建對象的方式,很多參數對于一個對象來說可能是可選的,開發者無需傳遞所有參數去創建對象,對于可選的參數如果用戶未傳就要去除,所以我們就可以將構建復雜組件的步驟與運用組件構建對象分離,使用builder模式建立。

1).優缺點
優點:

(1).分離構建過程和表示,使得構建過程更加靈活
(2).隱藏具體構建細節,提高封裝性
(3).提供代碼復用性

缺點:

(1).增加代碼復雜性,對于步驟簡單的對象沒必要使用此模式

2).應用場景

需要生成的對象具有復雜的內部結構,創建者創建對象的步驟和參數過多而且需要更加靈活

3).具體實現

比如一個用戶,姓名、電話、性別是必選的,但是住址、年齡、郵箱是可選的,有些用戶可能輸入年齡,有些用戶可能給了地址等;這里通過UserBuilder去實現根據不同的參數創建User對象;
(1).創建User類和UserBuilder類型

public class User {//名稱 必填private String name;//性別 必填private String sex;//電話 必填private String phone;//年齡 可選private Integer age;//住址 可選private String address;//住址 可選private String email;public User(UserBuilder userBuilder) {this.name = userBuilder.name;this.sex = userBuilder.sex;this.phone = userBuilder.phone;this.age = userBuilder.age;this.address = userBuilder.address;this.email = userBuilder.email;}public static UserBuilder builder(String name, String sex, String phone){return new UserBuilder(name,sex,phone);}public static class UserBuilder {//名稱private String name;//性別private String sex;//電話private String phone;//年齡private Integer age;//住址private String address;//住址private String email;//構造器public UserBuilder(String name, String sex, String phone) {this.name = name;this.sex = sex;this.phone = phone;}public UserBuilder age(Integer age) {this.age = age;return this;}public UserBuilder address(String address) {this.address = address;return this;}public UserBuilder email(String email) {this.email = email;return this;}public User build(){return new User(this);}}
}

(2).使用UserBuilder創建user
在這里插入圖片描述

5.原型模式

原型模式通過復制現有對象來創建新對象,也就是拷貝現有的實例對象來創建對象,而不需重頭創建對象。

1).優缺點
優點:

(1).提高創建對象的效率,減少創建對象成本
(2).無需知道構造函數內部邏輯,降低了耦合度

缺點:

(1).對于對象內部的引用有循環接口或者對象內部有不支持序列化的引用對象就不支持拷貝

2).應用場景

當類初始化比較復雜、比較耗時耗性能、需要獲取權限等的時候需要使用原型模式

3).深拷貝和淺拷貝

(1).淺拷貝:拷貝一個對象后,基本數據類型的變量會重新創建,引用類型指向的還是原對象所指向的
(2).深拷貝:拷貝一個對象后,基本數據類型還有引用對象都是重新創建的,比如clone方法就是深拷貝

4).具體實現

(1).實體類繼承Cloneable ,復寫clone方法

public class User implements Cloneable {//名稱 必填private String name;//性別 必填private String sex;//電話 必填private String phone;//年齡 可選private Integer age;//住址 可選private String address;//住址 可選private String email;@Overridepublic User clone() {try {return (User) super.clone();} catch (CloneNotSupportedException e) {return null;}}

(2).使用
在這里插入圖片描述

6.適配器模式

通過一個適配器類將一個接口轉換成另一個接口,使得兩個不兼容的對象能夠協同工作,從而消除不兼容問題

1).優缺點
優點:

(1).將不同的系統、庫、組件適配在一起,而無需修改太多的代碼,提高代碼的復用性
(2).擁有更高的靈活性

缺點:

(1).過多的適配器會導致代碼混亂降低維護性

2).類圖

Mp4PlayerImpl專門用于播放MP4文件,Mp3PlayerImpl專門用于播放MP3,如果Mp4PlayerImpl想播放MP3文件那么就需要一個適配器Mp4PlayerAdapter去適配Mp3PlayerImpl的接口,去代理播放MP3文件。

在這里插入圖片描述

3).具體實現

(1).實現MP4播放功能
在這里插入圖片描述
在這里插入圖片描述
(2).實現MP3播放功能
在這里插入圖片描述
在這里插入圖片描述
(3).實現MP4的適配器

在這里插入圖片描述

(4).使用
在這里插入圖片描述

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

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

相關文章

hive表在HDFS的每個文件的大小加大

配置參數: spark.hadoop.hive.exec.orc.default.stripe.size78643200 spark.hadoop.orc.stripe.size78643200 spark.hadoopRDD.targetBytesInPartition78643200 spark.hadoop.hive.exec.dynamic.partition.modenonstrict spark.sql.sources.partitionOverwriteMode…

華為OD機試 - 剩余銀飾的重量(Java 2024 C卷 100分)

華為OD機試 2024C卷題庫瘋狂收錄中,刷題點這里 專欄導讀 本專欄收錄于《華為OD機試(JAVA)真題(A卷B卷C卷)》。 刷的越多,抽中的概率越大,每一題都有詳細的答題思路、詳細的代碼注釋、樣例測試…

【Python】 如何對對象列表進行排序,有點意思

在Python中,我們經常需要對對象列表進行排序,這可以通過多種方式實現。當對象是一個自定義類實例時,排序通常基于對象的一個或多個屬性。Python提供了內置的sorted()函數和列表的sort()方法,它們都允許我們指定一個排序的關鍵字。…

iPhone徹底刪除的照片怎么恢復?專業技巧助您解憂

在使用iPhone的過程中,我們可能會因為誤操作或其他原因將一些重要的照片徹底刪除。然而,即使照片被徹底刪除,也并不意味著它們就永遠消失了,它們只是被打上了“可覆蓋的空間”的標簽。 在照片被新數據覆蓋之前,我們仍…

C語言學習【C控制語句:循環】

C語言學習【C控制語句:循環】 while循環 /* 根據用戶鍵入的整數求和 */#include "stdio.h"int main(void) {long num;long sum 0L; /* 把sum初始化為0 */int status;printf("Please enter an integer to be summed");printf(&quo…

基于微信小程序的校園捐贈系統的設計與實現

校園捐贈系統是一種便捷的平臺,為校園內的各種慈善活動提供支持和便利。通過該系統,學生、教職員工和校友可以方便地進行捐贈,并了解到相關的項目信息和捐助情況。本文將介紹一個基于Java后端和MySQL數據庫的校園捐贈系統的設計與實現。 技術…

Java日期Date和LocalDateTime的工具類

Date package com.qiangesoft.utils.date;import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date;/*** 日期工具類** author lq* date 2024-05-23*/ public class DateUtil {public static final String[] CHINESE_WEEK_DAY new String[]{&q…

Excel 公式積累

1.獲取當前位置的左側單元格 引用當前單元格左側的第一個單元格:OFFSET(INDIRECT(ADDRESS(ROW(), COLUMN())),0,-1) ROW()返回當前單元格的行號,COLUMN()返回當前單元格的列號。 ADDRESS函數可以根據指定行號和列號獲得工作表中的某個單元格的地址。例如…

go全部版本下載目錄

linux安裝教程: Download and install - The Go Programming Language rm -rf /usr/local/go && tar -C /usr/local -xzf go1.22.3.linux-amd64.tar.gzexport PATH$PATH:/usr/local/go/bin go version 全部版本下載目錄: All releases - Th…

鴻蒙本機通信

demo地址 https://github.com/MartinLi89/WanHarmony 目前只學到一部分,不正確的地方,還望大家指正,我會及時更新,謝謝,歡迎評論留言 線程內通信,線程間通信,進程間通信 本篇帖子中描述的比較寬…

快速開發 Chrome插件

什么是 Chrome 插件 Chrome 插件程序是一種用于增強 Google Chrome 瀏覽器功能的小型軟件應用程序。它們可以幫助用戶自定義瀏覽體驗、添加新功能、集成外部服務以及自動化任務等。擴展程序使用 HTML、CSS 和 JavaScript 編寫,利用 Chrome 提供的 API 來與瀏覽器及…

18.分布式監控zabbix-proxy

zabbix proxy 使用場景: 監控遠程區域設備監控本地網絡不穩定區域當 zabbix 監控上千設備時,使用它來減輕 server 的壓力簡化分布式監控的維護 環境規劃: zabbix-server:外網IP地址192.168.111.66 zabbix-proxy:外網IP地址192.168.111.11 內網IP地址…

AI工具推薦:提升工作效率與生活質量

有哪些好用,且國內可用的AI工具? 副本 在AI大發展的年代,還有人在工作、生活中沒有使用過AI嗎? 今天為大家推薦幾款國內可用、好用的AI工具,不論是自媒體文案寫作、打工人匯報PPT、還是論文、公文寫作,總…

設計系統采購與安裝:乙級資質申請的技術準備

在設計系統采購與安裝方面,為乙級資質申請所做的技術準備涉及多個方面。以下是一些關鍵的技術準備事項: 明確技術需求:首先,需要明確乙級資質申請所需的技術系統類型和規格。這可能包括但不限于設計軟件、工程管理系統、項目管理系…

【Linux】之【Get√】查看linux CPU 架構 ---- amd64、x86、x86_64、arm64

關于Linux軟件下載時:amd64、x86、x86_64、arm64 的說明 archuanme -alscpu

【設計模式深度剖析】【2】【創建型】【工廠方法模式】

👈?上一篇:單例模式 | 下一篇:抽象工廠模式👉? 目錄 工廠方法模式概覽工廠方法模式的定義英文原話直譯 工廠方法模式的4個角色抽象工廠(Creator)角色具體工廠(Concrete Creator)角色抽象產品&#x…

關于光照模型

關于光照模型 早期學習筆記,轉載自早期Excel。 存在大量格式錯誤、可讀性非常低,建議等待作者修復后閱讀、或者作為查找性材料使用。 中文名英文名/縮寫說明長什么樣蘭伯特光照模型Lambert Lighting1.蘭伯特反射(Lambert)是最常見的一種漫反射&#x…

iptables防火墻【其二 實驗篇】

保存&#xff0c;還原規則 防火墻規則的備份和還原 導出&#xff08;備份&#xff09;所有表的規則 iptables-save > /opt/ipt.txt 導入&#xff08;還原&#xff09;規則 iptables-restore < /opt/ipt.txt 將iptables規則文件保存在 /etc/sysconfig/iptables 中&#xf…

亞馬遜賣家賬號注冊復雜嗎?需要什么輔助工具嗎?

在當今數字化的商業世界中&#xff0c;亞馬遜作為全球最大的電商平臺之一&#xff0c;吸引著無數的賣家和買家。對于想要進入亞馬遜銷售市場的賣家來說&#xff0c;首先要完成的一項重要任務就是注冊亞馬遜賣家賬號。本文將詳細介紹亞馬遜注冊的步驟、所需時間&#xff0c;以及…

LIMS系統能解決實驗室管理的哪些痛點

LIMS&#xff08;Laboratory Information Management System&#xff0c;實驗室信息管理系統&#xff09;在解決實驗室管理的痛點方面發揮著重要作用。以下是LIMS系統能夠解決的一些主要痛點&#xff1a; 一、人工介入大量重復性工作 LIMS系統能夠自動化處理實驗室中的許多重復…