設計模式——創建型模式

什么是設計模式?

? ??設計模式是軟件工程中解決常見問題的經典方案,它們代表了最佳實踐和經驗總結。通過使用設計模式,開發者可以創建更加靈活、可維護和可擴展的代碼結構。設計模式不是具體的代碼實現,而是針對特定問題的通用解決方案模板,需要在特定上下文中適當應用。

設計模式的核心價值在于:

  • 提供經過驗證的解決方案

  • 促進代碼重用

  • 提高代碼可讀性和可維護性

  • 促進團隊之間的溝通

設計模式分為3類:

  • 創建型模式:關注對象創建機制,增加創建對象的靈活性
  • 結構型模式:關注類和對象的組合,形成更大的結構
  • 行為型模式:關注對象之間的職責分配和通信

創建型模式

單例模式

意圖:確保一個類只有一個實例,并提供全局訪問點

適用場景

  • 當類只能有一個實例且客戶端可從眾所周知的訪問點訪問它時

  • 當唯一實例應通過子類化擴展,且客戶端無需修改代碼就能使用擴展實例時

實現要點

  • 私有化構造函數

  • 提供靜態方法獲取實例

  • 考慮多線程環境下的安全性

示例

public class Singleton {//  volatile確保多線程環境下的可見性private static volatile Singleton instance;private Singleton() {// 防止通過反射實例化if (instance != null) {throw new RuntimeException("Use getInstance() method to get the single instance of this class.");}}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}

注意事項

  • 單例模式可能隱藏類之間的依賴關系

  • 不利于單元測試

  • 在分布式系統中可能需要調整

工廠方法模式

意圖:定義一個創建對象的接口,但讓子類決定實例化哪個類

適用場景

  • 當一個類不知道它需要創建哪些具體類的對象時

  • 當一個類希望由其子類指定創建的對象時

結構

  • Product:定義工廠方法創建的對象的接口

  • ConcreteProduct:實現Product接口的具體類

  • Creator:聲明工廠方法

  • ConcreteCreator:重寫工廠方法以返回ConcreteProduct實例

示例

// 產品接口
interface Button {void render();void onClick();
}// 具體產品 - HTML按鈕
class HtmlButton implements Button {@Overridepublic void render() {System.out.println("渲染HTML按鈕");}@Overridepublic void onClick() {System.out.println("HTML按鈕點擊事件");}
}// 具體產品 - Windows按鈕
class WindowsButton implements Button {@Overridepublic void render() {System.out.println("渲染Windows按鈕");}@Overridepublic void onClick() {System.out.println("Windows按鈕點擊事件");}
}// 創建者基類
abstract class Dialog {// 工廠方法public abstract Button createButton();public void render() {Button button = createButton();button.render();button.onClick();}
}// 具體創建者 - HTML對話框
class HtmlDialog extends Dialog {@Overridepublic Button createButton() {return new HtmlButton();}
}// 具體創建者 - Windows對話框
class WindowsDialog extends Dialog {@Overridepublic Button createButton() {return new WindowsButton();}
}

抽象工廠模式

意圖:提供一個接口,用于創建相關或依賴對象的家族,而不需要指定具體類

適用場景

  • 系統需要獨立于其產品的創建、組合和表示時

  • 系統需要配置多個產品系列中的一個時

  • 需要強調一系列相關產品對象的設計以便進行聯合使用時

示例

// 抽象產品 - 按鈕
interface Button {void paint();
}// 抽象產品 - 復選框
interface Checkbox {void paint();
}// 具體產品 - Mac按鈕
class MacOSButton implements Button {@Overridepublic void paint() {System.out.println("繪制MacOS風格按鈕");}
}// 具體產品 - Windows按鈕
class WindowsButton implements Button {@Overridepublic void paint() {System.out.println("繪制Windows風格按鈕");}
}// 具體產品 - Mac復選框
class MacOSCheckbox implements Checkbox {@Overridepublic void paint() {System.out.println("繪制MacOS風格復選框");}
}// 具體產品 - Windows復選框
class WindowsCheckbox implements Checkbox {@Overridepublic void paint() {System.out.println("繪制Windows風格復選框");}
}// 抽象工廠
interface GUIFactory {Button createButton();Checkbox createCheckbox();
}// 具體工廠 - Mac工廠
class MacOSFactory implements GUIFactory {@Overridepublic Button createButton() {return new MacOSButton();}@Overridepublic Checkbox createCheckbox() {return new MacOSCheckbox();}
}// 具體工廠 - Windows工廠
class WindowsFactory implements GUIFactory {@Overridepublic Button createButton() {return new WindowsButton();}@Overridepublic Checkbox createCheckbox() {return new WindowsCheckbox();}
}// 客戶端代碼
class Application {private Button button;private Checkbox checkbox;public Application(GUIFactory factory) {button = factory.createButton();checkbox = factory.createCheckbox();}public void paint() {button.paint();checkbox.paint();}
}

建造者模式

意圖:將一個復雜對象的構建與其表示分離,使得同樣的構建過程可以創建不同的表示

適用場景

  • 當創建復雜對象的算法應該獨立于該對象的組成部分以及它們的裝配方式時

  • 當構造過程必須允許被構造的對象有不同的表示時

示例

// 最終產品
class Car {private String engine;private int seats;private boolean GPS;private boolean tripComputer;// 省略getter和setter方法public void display() {System.out.println("汽車配置:");System.out.println("引擎:" + engine);System.out.println("座位數:" + seats);System.out.println("GPS:" + (GPS ? "有" : "無"));System.out.println("行車電腦:" + (tripComputer ? "有" : "無"));}
}// 抽象建造者
interface CarBuilder {void reset();void setEngine(String engine);void setSeats(int seats);void setGPS(boolean hasGPS);void setTripComputer(boolean hasTripComputer);Car getResult();
}// 具體建造者
class SportsCarBuilder implements CarBuilder {private Car car;public SportsCarBuilder() {this.reset();}@Overridepublic void reset() {this.car = new Car();}@Overridepublic void setEngine(String engine) {car.setEngine(engine);}@Overridepublic void setSeats(int seats) {car.setSeats(seats);}@Overridepublic void setGPS(boolean hasGPS) {car.setGPS(hasGPS);}@Overridepublic void setTripComputer(boolean hasTripComputer) {car.setTripComputer(hasTripComputer);}@Overridepublic Car getResult() {Car product = this.car;this.reset();return product;}
}// 導演類
class Director {public void constructSportsCar(CarBuilder builder) {builder.reset();builder.setEngine("V8引擎");builder.setSeats(2);builder.setGPS(true);builder.setTripComputer(true);}public void constructSUV(CarBuilder builder) {builder.reset();builder.setEngine("V6引擎");builder.setSeats(7);builder.setGPS(true);builder.setTripComputer(false);}
}// 客戶端使用
public class BuilderDemo {public static void main(String[] args) {Director director = new Director();CarBuilder builder = new SportsCarBuilder();director.constructSportsCar(builder);Car car = builder.getResult();car.display();}
}

原型模式

意圖:用原型實例指定創建對象的種類,并且通過拷貝這些原型創建新的對象

適用場景

  • 當要實例化的類是在運行時指定時

  • 當需要避免創建與產品類層次平行的工廠類層次時

  • 當一個類的實例只能有幾個不同狀態組合中的一種時

示例

// 原型接口
interface Prototype {Prototype clone();String getName();void setName(String name);
}// 具體原型
class ConcretePrototype implements Prototype {private String name;public ConcretePrototype(String name) {this.name = name;}@Overridepublic Prototype clone() {return new ConcretePrototype(this.name);}@Overridepublic String getName() {return name;}@Overridepublic void setName(String name) {this.name = name;}
}// 客戶端使用
public class PrototypeDemo {public static void main(String[] args) {ConcretePrototype original = new ConcretePrototype("原始對象");System.out.println("原始對象名稱: " + original.getName());ConcretePrototype cloned = (ConcretePrototype) original.clone();cloned.setName("克隆對象");System.out.println("原始對象名稱: " + original.getName());System.out.println("克隆對象名稱: " + cloned.getName());}
}

:)

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

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

相關文章

我愛學算法之—— 位運算(上)

常見位運算 對于位運算: &:按位與,有0則0。 |:按位或,有1則1。 ^:按位異或,相同為0、不同為1。(無進位相加) ~:二進制位按位取反。 對于位運算的常見使用…

智能語音系統

智能語音系統通過技術手段讓機器能夠“聽懂”、“理解”并“回應”人類的語音,是實現人機交互的關鍵技術之一。下面我將為你梳理智能語音系統的核心組成部分、工作原理、應用場景以及面臨的挑戰。🧠 核心技術與工作原理智能語音系統之所以能實現人機交互…

水泵自動化遠程監測與控制的御控物聯網解決方案

一、行業背景與痛點分析水泵作為工業生產、農業灌溉、城市供水等領域的核心設備,其運行效率直接影響系統穩定性與運營成本。然而,傳統管理模式存在三大核心痛點:人工巡檢低效:偏遠地區水泵分布分散,依賴人工定期巡檢&a…

Python實現點云法向量各種方向設定

本次我們分享點云法向量定向的四種方法,分別是XYZ軸、相機位置、最小生成樹(MST)和質心設定方法。通常出現在三維點云處理、三維重建、計算機視覺或圖形學中,需要估計點云的法向量方向。它們的核心任務是:在已知點坐標和局部幾何結構&#xf…

騰訊云智能體開發平臺

提供全球領先的云計算服務騰訊云,騰訊集團傾力打造的云計算品牌,面向全世界各個國家和地區的政府機構、企業組織和個人開發者,提供全球領先的云計算、大數據、人工智能等技術產品與服務,以卓越的科技能力打造豐富的行業解決方案&a…

css flex布局,設置flex-wrap:wrap換行后,如何保證子節點被內容撐高后,每一行的子節點高度一致。

flex布局&#xff0c;設置flex-wrap&#xff1a;wrap換行后&#xff0c;如何保證子節點被內容撐高后&#xff0c;每一行的子節點高度一致。核心&#xff1a;需要設置父節點和子節點&#xff1a;align-items: stretch&#xff0c;兩個都要。代碼&#xff1a;<div class"…

Nginx_Tomcat綜合案例

要求 需求&#xff1a;通過 nginx 來代理兩個 tomcat 服務器&#xff08;反向代理&#xff09;&#xff0c;然后通過 https://www.nginx.com 來進行訪問。主機名IP軟件nginx192.168.30.10nginxtomcat1192.168.30.11java&#xff0c;tomcattomcat2192.168.30.12java&#xff0c;…

【Vue2手錄12】單文件組件SFC

一、知識回顧-Vue2項目基礎操作與環境配置 1.1 項目啟動 項目打開方式&#xff1a;直接將項目文件夾&#xff08;如my-app&#xff09;拖拽到 Visual Studio Code&#xff08;推薦編輯器&#xff09;&#xff0c;避免拖拽父級文件夾&#xff0c;防止路徑混亂。啟動命令&#xf…

VS2022下載+海康SDK環境配置實現實時預覽

一.VS2022下載去官網下載就可以了&#xff1a;https://visualstudio.microsoft.com/zh-hans/vs/下載Community版本是免費的。&#xff08;2&#xff09;下載后得安裝包VisualStudioSetup.exe打開&#xff1a;點擊繼續等待下載完成&#xff0c;出現如下界面&#xff0c;這里是選…

YOLO 模型從 PyTorch 轉換為 ONNX 并優化

YOLO 模型從 PyTorch 轉換為 ONNX 并優化 在深度學習部署中&#xff0c;ONNX&#xff08;Open Neural Network Exchange&#xff09; 已成為跨框架與跨平臺的標準格式。我們經常需要將 YOLOv8 在 PyTorch 中訓練好的模型轉換為 ONNX&#xff0c;并進行優化&#xff0c;以便在 …

推進新型信息基礎設施建設發展:蜂窩模組行業迎來結構性機遇

工信部副部長張云明在2025年9月9日國新辦新聞發布會上明確表示&#xff0c;將"扎實推進新型信息基礎設施建設發展"&#xff0c;并重點強調"打造新型工業網絡&#xff0c;推進蜂窩車聯網部署" 。這一政策表態對蜂窩模組行業產生深遠影響&#xff0c;將推動行…

返利app排行榜的緩存更新策略:基于過期時間與主動更新的混合方案

返利app排行榜的緩存更新策略&#xff1a;基于過期時間與主動更新的混合方案 大家好&#xff0c;我是阿可&#xff0c;微賺淘客系統及省賺客APP創始人&#xff0c;是個冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 在返利APP中&#xff0c;“熱門商品排行榜”“用…

科技信息差(9.12)

AI量子計算重塑藥物研發&#xff1a;技術融合路徑與產業革命一、引言&#xff1a;技術融合的顛覆性機遇2025年9月&#xff0c;AI藥物研發公共服務平臺正式上線&#xff0c;宣稱可將新藥上市時間縮短近半1。與此同時&#xff0c;量子計算與AI的跨界合作在KRAS抑制劑開發中取得突…

Java 分布式緩存實現:結合 RMI 與本地文件緩存

目錄 一、核心思路 二、項目結構說明 2.1 服務端項目結構&#xff08;IDEA&#xff09; 2.2 客戶端項目結構&#xff08;Eclipse&#xff09; 三、服務端實現&#xff08;IDEA&#xff09; 3.1 數據庫訪問層 3.2 遠程接口定義 3.3 遠程服務實現 3.4 服務端啟動類 四、…

Electron第一個應用

1、安裝node nodeJS下載 2、下載完成&#xff0c;需要配置環境。 寫道path路徑 、 3、安裝完成&#xff0c;查看版本 npm -v4、 配置cnpm npm install -g cnpm --registryhttps://registry.npmmirror.com5、參考Electron 寫&#xff1a; Electron第一個程序hello 6、安裝…

React 原理篇 - React 新架構深度解析

使用過 React v16 之前版本的開發者或許都經歷過這樣的場景&#xff1a;當頁面包含復雜組件或大量列表時&#xff0c;輸入框打字會卡頓&#xff0c;滾動會不流暢。這些體驗問題的背后&#xff0c;往往與 React 的渲染機制密切相關。2017 年 React v16 推出的 Fiber 架構&#x…

【JavaSE五天速通|第三篇】常用API與日期類篇

適合有其他語言基礎想快速入門JavaSE的。用的資料是 Java入門基礎視頻教程 &#xff0c;從中摘取了筆者認為與其他語言不同或需要重點學習的內容 常用API與日期類只需要有印象即可&#xff0c;用到了再來這查 day04 常用API 一、StringBuilder類 StringBuilder代表可變字符…

K8s學習筆記(二) Pod入門與實戰

1 K8s核心資源Pod 1.1 Pod是什么&#xff1f; 官方文檔&#xff1a;Pod | Kubernetes Pod 是 Kubernetes&#xff08;k8s&#xff09;中最小的部署與調度單元&#xff0c;并非直接運行容器&#xff0c;而是對一個或多個 “緊密關聯” 容器的封裝。 核心特點可簡單總結為 3 …

用 Python 調用 Bright Data MCP Server:在 VS Code 中實現實時網頁數據抓取

用 Python 調用 Bright Data MCP Server&#xff1a;在 VS Code 中實現實時網頁數據抓取&#xff0c;本文介紹了Bright Data的Web MCP Server&#xff0c;這是一款能實現實時、結構化網頁數據訪問的API&#xff0c;適用于AI應用等場景。其支持靜態與動態網頁&#xff0c;前3個月…

SPSS繪制ROC曲線并計算靈敏度、特異度

SPSS繪制ROC曲線并計算靈敏度、特異度。 &#xff08;1&#xff09;繪制ROC曲線&#xff1a; 輸入&#xff1a;預測值、受試者標簽。 在SPSS中點擊“分析”-“分類”-“ROC曲線” 變量輸入&#xff1a;檢驗變量輸入預測值&#xff0c;狀態變量輸入受試者標簽&#xff0c;如果標…