設計模式使用場景實現示例及優缺點(創建型模式——工廠方法模式、抽象工廠模式)

創建型模式

工廠方法模式 (Factory Method Pattern)

工廠方法模式(Factory Method Pattern)是一種創建型設計模式,提供了一個創建對象的接口,但由子類決定要實例化的類是哪一個。工廠方法模式讓類的實例化推遲到子類。這樣,客戶端代碼將依賴于具體子類的實現,而不是直接依賴于具體的對象。

適用場景

  1. 代碼需要處理不同類型的對象,但不希望將對象的創建邏輯耦合到代碼中

    • 比如,在處理不同數據庫類型(如 MySQL、PostgreSQL)時,可以使用工廠方法模式來創建數據庫連接對象,而不需要在客戶端代碼中直接引用具體的數據庫類。
  2. 代碼中涉及復雜的對象創建過程

    • 如果對象的創建過程很復雜,包括許多步驟和配置,工廠方法模式可以將創建邏輯集中在一個地方,簡化客戶端代碼。
  3. 客戶端代碼不應依賴于具體類來創建對象

    • 工廠方法模式使客戶端代碼依賴于抽象類或接口,從而提高代碼的靈活性和可擴展性。

實現示例(Java)

下面是一個使用工廠方法模式的示例,展示如何創建不同類型的日志記錄器(如文件日志記錄器和數據庫日志記錄器):

1. 定義產品接口或抽象類
public interface Logger {void log(String message);
}
2. 具體產品類實現接口或繼承抽象類
public class FileLogger implements Logger {@Overridepublic void log(String message) {System.out.println("File logger: " + message);}
}public class DatabaseLogger implements Logger {@Overridepublic void log(String message) {System.out.println("Database logger: " + message);}
}
3. 定義工廠方法的抽象類
public abstract class LoggerFactory {public abstract Logger createLogger();public void log(String message) {Logger logger = createLogger();logger.log(message);}
}
4. 具體工廠類實現工廠方法
public class FileLoggerFactory extends LoggerFactory {@Overridepublic Logger createLogger() {return new FileLogger();}
}public class DatabaseLoggerFactory extends LoggerFactory {@Overridepublic Logger createLogger() {return new DatabaseLogger();}
}
5. 客戶端代碼
public class Main {public static void main(String[] args) {LoggerFactory factory;Logger logger;// 使用文件日志記錄器factory = new FileLoggerFactory();factory.log("This is a file log message.");// 使用數據庫日志記錄器factory = new DatabaseLoggerFactory();factory.log("This is a database log message.");}
}

工廠方法模式的優點

  1. 代碼解耦

    • 客戶端代碼依賴于抽象產品接口或抽象工廠,而不是具體的產品類,從而實現了代碼的解耦。
  2. 提高靈活性

    • 新的具體產品可以通過實現產品接口并創建相應的具體工廠類來添加,而無需修改現有代碼。
  3. 單一職責原則

    • 將對象創建的責任委派給具體工廠類,符合單一職責原則。

工廠方法模式的缺點

  1. 類的數量增加

    • 每添加一種新的產品類型,都需要創建一個具體產品類和相應的具體工廠類,可能會導致類的數量增加。
  2. 實現復雜

    • 工廠方法模式可能會使代碼結構變得復雜,特別是在存在多個產品層次結構時。

總結

工廠方法模式通過將對象的創建過程封裝在工廠方法中,實現了客戶端代碼與具體產品類的解耦。它適用于對象創建過程復雜、多種類型的對象創建等場景,有助于提高代碼的靈活性和可維護性。

抽象工廠模式

抽象工廠模式(Abstract Factory Pattern)是一種創建型設計模式,它提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。抽象工廠模式通過對產品類的工廠進行抽象,使得一個工廠可以生產多種類型的產品。

適用場景

  1. 系統需要獨立于產品創建的方式時

    • 客戶端代碼不需要知道具體產品的創建過程,只需要知道如何使用抽象接口。
  2. 系統有多個產品系列,每個系列有多種類型的產品時

    • 例如,GUI庫可能提供不同風格的窗口和按鈕(如Windows風格和Mac風格),抽象工廠可以提供一個接口來創建不同風格的組件。
  3. 需要保證產品系列的一致性時

    • 抽象工廠模式確保同一個工廠創建的產品系列是兼容的。

實現示例(Java)

以下是一個簡單的抽象工廠模式的實現示例,展示如何創建不同風格的GUI組件(如按鈕和復選框)。

1. 定義抽象產品接口
// 抽象產品A
public interface Button {void paint();
}// 抽象產品B
public interface Checkbox {void paint();
}
2. 具體產品類實現抽象產品接口
// 具體產品A1
public class WindowsButton implements Button {@Overridepublic void paint() {System.out.println("Windows Button");}
}// 具體產品A2
public class MacButton implements Button {@Overridepublic void paint() {System.out.println("Mac Button");}
}// 具體產品B1
public class WindowsCheckbox implements Checkbox {@Overridepublic void paint() {System.out.println("Windows Checkbox");}
}// 具體產品B2
public class MacCheckbox implements Checkbox {@Overridepublic void paint() {System.out.println("Mac Checkbox");}
}
3. 定義抽象工廠接口
public interface GUIFactory {Button createButton();Checkbox createCheckbox();
}
4. 具體工廠類實現抽象工廠接口
// 具體工廠1
public class WindowsFactory implements GUIFactory {@Overridepublic Button createButton() {return new WindowsButton();}@Overridepublic Checkbox createCheckbox() {return new WindowsCheckbox();}
}// 具體工廠2
public class MacFactory implements GUIFactory {@Overridepublic Button createButton() {return new MacButton();}@Overridepublic Checkbox createCheckbox() {return new MacCheckbox();}
}
5. 客戶端代碼
public 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();}public static void main(String[] args) {// 可根據需求選擇具體工廠GUIFactory factory = new WindowsFactory();Application app = new Application(factory);app.paint();factory = new MacFactory();app = new Application(factory);app.paint();}
}

注釋說明

  1. 抽象產品接口

    • ButtonCheckbox 是兩個抽象產品接口,定義了產品的通用行為(如 paint 方法)。
  2. 具體產品類

    • WindowsButtonMacButtonWindowsCheckboxMacCheckbox 是具體產品類,它們實現了抽象產品接口,提供具體的產品行為。
  3. 抽象工廠接口

    • GUIFactory 是抽象工廠接口,定義了創建一系列相關產品的方法(如 createButtoncreateCheckbox)。
  4. 具體工廠類

    • WindowsFactoryMacFactory 是具體工廠類,它們實現了抽象工廠接口,提供了具體的產品創建方法。
  5. 客戶端代碼

    • Application 類通過依賴抽象工廠接口來創建產品。這樣,客戶端代碼與具體產品類解耦,便于擴展和維護。

總結

抽象工廠模式通過對產品類和工廠類的抽象,使得客戶端代碼可以獨立于具體產品類和工廠類進行工作。它適用于需要創建一系列相關或相互依賴對象的系統,有助于提高代碼的靈活性和一致性。

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

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

相關文章

關于MySQL mvcc

innodb mvcc mvcc 多版本并發控制 在RR isolution 情況下 trx在啟動的時候就拍了個快照。這個快照是基于整個數據庫的。 其實這個快照并不是說拷貝整個數據庫。并不是說要拷貝出這100個G的數據。 innodb里面每個trx有一個唯一的trxID 叫做trx id .在trx 開始的時候向innodb系…

嵌入式音頻處理技術的現在發展及未來的方向

嵌入式音頻處理技術:從音頻流媒體到聲音識別 嵌入式音頻處理技術的迅猛發展正在改變我們的生活方式,從音頻流媒體到聲音識別,這個領域為人們的生活和工作帶來了巨大的影響。本文將探討嵌入式音頻處理技術的最新趨勢和應用,以及提…

邏輯回歸模型(非回歸問題,而是解決二分類問題)

目錄: 一、Sigmoid激活函數:二、邏輯回歸介紹:三、決策邊界四、邏輯回歸模型訓練過程:1.訓練目標:2.梯度下降調整參數: 一、Sigmoid激活函數: Sigmoid函數是構建邏輯回歸模型的重要激活函數&am…

openlayers更改點坐標

我現在的需求是無人機點位根據ws傳輸的經緯度改變位置,在網上查了很多資料,終于是做出來了,如果有問題請指出。 效果圖,無人機可以來回移動 這里是核心代碼 // 添加飛機點位圖層let vectorLayerpointfunction DronepointLayer()…

Mercer 條件的基本概念及證明

Mercer 條件 是核函數理論中的一個重要概念,它確保了一個給定的對稱函數可以表示為某個高維特征空間中的內積。這個條件在支持向量機(SVM)和其他基于核方法的機器學習算法中非常重要。 文章目錄 基本介紹Mercer 條件的定義Mercer 定理實際應用…

Kafka(三)Producer第二篇

一,生產者架構 生產者客戶端由兩個線程協調運行,分別為主線程和Sender線程(發送線程)。 主線程:KafkaProducer創建消息,通過攔截器、序列化器和分區器之后緩存到消息收集器RecordAccumulator中;…

Redis 中的跳躍表(Skiplist)基本介紹

Redis 中的跳躍表(Skiplist)是一種用于有序元素集合的快速查找數據結構。它通過一個多級索引來提高搜索效率,能夠在對數時間復雜度內完成查找、插入和刪除操作。跳躍表特別適用于實現有序集合(sorted set)的功能&#…

大語言模型的直接偏好優化(DPO)對齊在PAI-QuickStart實踐

直接偏好優化(Direct Preference Optimization,DPO)算法是大語言模型對齊的經典算法之一,它巧妙地將獎勵模型(Reward Model)訓練和強化學習(RL)兩個步驟合并成了一個,使得訓練更加快…

MySQL 給數據表增加一列,一定會鎖表嗎?

在 MySQL 中,給數據表增加一列,是否會鎖表取決于使用的存儲引擎以及 MySQL 的版本。 InnoDB 存儲引擎在 MySQL 之前的行為 之前版本的 MySQL 中,如果你使用 ALTER TABLE 命令來增加一列,對于使用 InnoDB 存儲引擎的表&#xff0…

【算法】單調隊列單調棧

一、單調隊列 用來維護一段區間內的最大值或最小值,例如滑動窗口、區間最值等問題。 基本概念 單調隊列是一種存儲數據的隊列,其中元素的順序是單調遞增或單調遞減的。在算法競賽中,我們一般使用兩個單調隊列,一個維護單調遞增序…

【版面費優惠丨ACM獨立出版丨接受全文摘要投稿】2024年生物醫藥和智能技術國際學術會議(ICBIT 2024,8月23-25)

“2024年生物醫藥和智能技術國際學術會議(ICBIT 2024)”擬定于2024年8月23-25日于珠海召開。近年來,智能技術已經逐漸走入生物醫藥領域,并在與生物醫藥領域的融合創新中凸顯出巨大的發展潛力和社會價值。人工智能技術在生物醫藥領…

水處理基本知識

RO反滲透程序設計軟件下載 水處理基本知識 純水制備的核心工藝 核心工藝:純水(超純水)制備的主要處理工藝,結合前處理(預處理)工藝,輔助工藝及特殊工藝,組成完整的純水制備工藝。結…

優質作品集秘訣:8個技巧讓你的作品脫穎而出

制作一個高質量的投資組合不僅可以展示你的技能和創造力,還可以幫助你在求職和職業發展中脫穎而出。如何制作高質量的投資組合?今天給大家講述作品集的 8 個實用技能,幫助你制作出令人印象深刻的作品集! 1、精選作品 并不是所有…

飛睿智能會議室靜止雷達人體檢測傳感器,實時監測使用狀態,有人、無人智能感應節能減

在這個科技日新月異的時代,每一個細微的創新都可能成為推動行業創新的關鍵力量。今天,讓我們聚焦于一項看似不起眼卻實則潛力無限的技術——飛睿智能靜止雷達人體檢測傳感器,以及它在會議室這一商務交流核心區域中的巧妙應用。想象一下&#…

前端Canvas入門——怎么用Canvas畫一些簡單的圖案

Canvas作為前端的畫圖工具&#xff0c;其實用途還是蠻廣泛的&#xff0c;但是很多前端學習課程其實都很少涉及到這塊內容。 于是乎&#xff0c;就寫下這個了。 當然啦&#xff0c;目前還在學習摸索中。 一些實戰代碼&#xff0c;僅供參考&#xff1a; <canvasid"ctx&…

EtherCAT總線冗余讓制造更安全更可靠更智能

冗余定義 什么是總線冗余功能&#xff1f;我們都知道&#xff0c;EtherCAT現場總線具有靈活的拓撲結構&#xff0c;設備間支持線型、星型、樹型的連接方式&#xff0c;其中線型結構簡單、傳輸效率高&#xff0c;大多數的現場應用中也是使用這種連接方式&#xff0c;如下圖所示…

【Qt課設】基于Qt實現的中國象棋

一、摘 要 本報告討論了中國象棋程序設計的關鍵技術和方法。首先介紹了中國象棋的棋盤制作&#xff0c;利用Qt中的一些繪畫類的函數來進行繪制。在創作中國象棋棋子方面&#xff0c;首先&#xff0c;我們先定義一下棋子類&#xff0c;將棋子中相同的部分進行打包&#xff0c;使…

idea推送到gitee 401錯誤

在idea上推送時遇到這樣的問題&#xff0c;解決方法如下&#xff1a; 在https://的后面加上 用戶名:密碼 然后再提交就ok啦&#xff01;

三、SpringMVC

三、SpringMVC 1、SpringMVC簡介 1.1、什么是MVC MVC是一種軟件架構的思想&#xff0c;將軟件按照模型、視圖、控制器來劃分 M&#xff1a;Model&#xff0c;模型層&#xff0c;指工程中的JavaBean&#xff0c;作用是處理數據 JavaBean分為兩類&#xff1a; 一類稱為實體…

c語言實戰-極簡掃雷

C語言/c寫的C語言實戰項目掃雷 結構比較清晰&#xff0c;僅供參考&#xff1a; 核心是掃雷的遞歸算法實現 上代碼: #include <stdio.h> #include <stdlib.h> #include <time.h>#define SIZE 10 #define MINES 15char board[SIZE][SIZE]; // 游戲棋盤// 初…