抽象工廠模式與工廠方法(簡單工廠)的區別

在軟件開發中,簡單工廠模式和工廠方法模式是兩種常用的創建型設計模式。盡管它們都用于創建對象,但它們的實現方式和應用場景有所不同。本文將詳細探討這兩種模式的區別,幫助你更好地理解和應用它們。

簡單工廠模式

簡單工廠模式,又稱靜態工廠方法模式,它通過一個工廠類的靜態方法,根據傳入的參數來決定創建哪一種產品對象。

簡單工廠模式的結構
  1. 工廠類(Factory Class):包含一個靜態方法,根據傳入的參數決定實例化哪個具體類。
  2. 產品類(Product Classes):具體的產品類實現相同的接口或繼承相同的抽象類。
  3. 客戶端(Client):通過調用工廠類的靜態方法來獲取產品對象,而不是直接創建對象。
簡單工廠模式的示例
// 產品接口
public interface Shape {void draw();
}// 具體產品類
public class Circle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a Circle");}
}public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a Rectangle");}
}// 工廠類
public class ShapeFactory {public static Shape createShape(String shapeType) {if (shapeType == null) {return null;}if (shapeType.equalsIgnoreCase("CIRCLE")) {return new Circle();} else if (shapeType.equalsIgnoreCase("RECTANGLE")) {return new Rectangle();}return null;}
}// 客戶端
public class Client {public static void main(String[] args) {Shape shape1 = ShapeFactory.createShape("CIRCLE");shape1.draw();Shape shape2 = ShapeFactory.createShape("RECTANGLE");shape2.draw();}
}

?

工廠方法模式

工廠方法模式定義了一個創建對象的接口,但由子類決定要實例化的類是哪一個。它使一個類的實例化延遲到其子類。

工廠方法模式的結構
  1. 抽象工廠類(Abstract Factory Class):定義一個抽象的工廠方法,讓子類實現這個方法來創建產品對象。
  2. 具體工廠類(Concrete Factory Classes):實現抽象工廠類的工廠方法,實例化具體的產品對象。
  3. 產品類(Product Classes):具體的產品類實現相同的接口或繼承相同的抽象類。
  4. 客戶端(Client):通過調用具體工廠類的工廠方法來獲取產品對象,而不是直接創建對象。
工廠方法模式的示例
// 產品接口
public interface Shape {void draw();
}// 具體產品類
public class Circle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a Circle");}
}public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a Rectangle");}
}// 抽象工廠類
public abstract class ShapeFactory {public abstract Shape createShape();
}// 具體工廠類
public class CircleFactory extends ShapeFactory {@Overridepublic Shape createShape() {return new Circle();}
}public class RectangleFactory extends ShapeFactory {@Overridepublic Shape createShape() {return new Rectangle();}
}// 客戶端
public class Client {public static void main(String[] args) {ShapeFactory circleFactory = new CircleFactory();Shape shape1 = circleFactory.createShape();shape1.draw();ShapeFactory rectangleFactory = new RectangleFactory();Shape shape2 = rectangleFactory.createShape();shape2.draw();}
}
區別
  1. 復雜度

    • 簡單工廠模式:實現簡單,只需要一個工廠類的靜態方法。適用于產品種類較少、變化不頻繁的情況。
    • 工廠方法模式:結構復雜,需要定義抽象工廠類和多個具體工廠類。適用于產品種類較多、經常變化的情況。
  2. 擴展性

    • 簡單工廠模式:不符合開閉原則(Open/Closed Principle),每次添加新產品都需要修改工廠類的代碼。
    • 工廠方法模式:符合開閉原則,添加新產品時只需添加新的具體工廠類,不需要修改現有代碼。
  3. 靈活性

    • 簡單工廠模式:客戶端代碼依賴于工廠類的靜態方法,靈活性較差。
    • 工廠方法模式:通過多態性實現,客戶端代碼可以動態選擇使用哪個具體工廠類,靈活性更高。
選擇哪種模式?
  • 如果產品種類較少且變化不頻繁,可以使用簡單工廠模式,因為它實現簡單且直觀。
  • 如果產品種類較多且經常變化,建議使用工廠方法模式,因為它具有更好的擴展性和靈活性。

抽象工廠模式與工廠方法模式的區別

在軟件設計中,工廠方法模式(Factory Method Pattern)和抽象工廠模式(Abstract Factory Pattern)都是創建型設計模式,它們都用于創建對象,但它們的實現方式和應用場景有所不同。本文將詳細探討這兩種模式的區別,幫助你更好地理解和應用它們。

工廠方法模式

工廠方法模式通過定義一個創建對象的接口,讓子類決定實例化哪一個類。這樣,工廠方法模式讓類的實例化延遲到子類。

工廠方法模式的結構
  1. 抽象產品類(Abstract Product Class):定義產品的接口。
  2. 具體產品類(Concrete Product Classes):實現抽象產品接口。
  3. 抽象工廠類(Abstract Factory Class):定義一個創建產品對象的抽象方法。
  4. 具體工廠類(Concrete Factory Classes):實現抽象工廠類,具體化創建產品對象的方法。
示例
// 抽象產品接口
public interface Shape {void draw();
}// 具體產品類
public class Circle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a Circle");}
}public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a Rectangle");}
}// 抽象工廠類
public abstract class ShapeFactory {public abstract Shape createShape();
}// 具體工廠類
public class CircleFactory extends ShapeFactory {@Overridepublic Shape createShape() {return new Circle();}
}public class RectangleFactory extends ShapeFactory {@Overridepublic Shape createShape() {return new Rectangle();}
}// 客戶端
public class Client {public static void main(String[] args) {ShapeFactory circleFactory = new CircleFactory();Shape shape1 = circleFactory.createShape();shape1.draw();ShapeFactory rectangleFactory = new RectangleFactory();Shape shape2 = rectangleFactory.createShape();shape2.draw();}
}
抽象工廠模式

抽象工廠模式提供一個接口,用于創建一系列相關或依賴對象的家族,而無需指定具體類。

關鍵在于客戶端代碼使用工廠時不需要關心具體的工廠和產品類是什么,而是通過工廠接口或抽象類來創建產品

抽象工廠模式的結構
  1. 抽象產品類(Abstract Product Classes):定義不同產品的接口。
  2. 具體產品類(Concrete Product Classes):實現抽象產品接口。
  3. 抽象工廠類(Abstract Factory Class):定義創建一組相關或依賴對象的接口。
  4. 具體工廠類(Concrete Factory Classes):實現抽象工廠接口,具體化創建一組相關或依賴對象的方法。
示例
// 抽象產品接口
public interface Shape {void draw();
}public interface Color {void fill();
}// 具體產品類
public class Circle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a Circle");}
}public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a Rectangle");}
}public class Red implements Color {@Overridepublic void fill() {System.out.println("Filling with Red");}
}public class Blue implements Color {@Overridepublic void fill() {System.out.println("Filling with Blue");}
}// 抽象工廠接口
public interface AbstractFactory {Shape createShape(String shapeType);Color createColor(String colorType);
}// 具體工廠類
public class ShapeFactory implements AbstractFactory {@Overridepublic Shape createShape(String shapeType) {if (shapeType == null) {return null;}if (shapeType.equalsIgnoreCase("CIRCLE")) {return new Circle();} else if (shapeType.equalsIgnoreCase("RECTANGLE")) {return new Rectangle();}return null;}@Overridepublic Color createColor(String colorType) {return null; // ShapeFactory 不負責創建顏色對象}
}public class ColorFactory implements AbstractFactory {@Overridepublic Shape createShape(String shapeType) {return null; // ColorFactory 不負責創建形狀對象}@Overridepublic Color createColor(String colorType) {if (colorType == null) {return null;}if (colorType.equalsIgnoreCase("RED")) {return new Red();} else if (colorType.equalsIgnoreCase("BLUE")) {return new Blue();}return null;}
}// 客戶端
public class Client {public static void main(String[] args) {AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");Shape shape1 = shapeFactory.createShape("CIRCLE");shape1.draw();Shape shape2 = shapeFactory.createShape("RECTANGLE");shape2.draw();AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");Color color1 = colorFactory.createColor("RED");color1.fill();Color color2 = colorFactory.createColor("BLUE");color2.fill();}
}// 工廠生成器類
public class FactoryProducer {public static AbstractFactory getFactory(String choice) {if (choice.equalsIgnoreCase("SHAPE")) {return new ShapeFactory();} else if (choice.equalsIgnoreCase("COLOR")) {return new ColorFactory();}return null;}
}
工廠方法模式與抽象工廠模式的區別
  1. 產品維度

    • 工廠方法模式:關注的是單一產品對象的創建,適用于創建單一產品的場景。
    • 抽象工廠模式:關注的是一組相關或互相依賴的產品對象的創建,適用于創建產品族的場景。
  2. 工廠接口的復雜度

    • 工廠方法模式:工廠接口只包含一個創建方法,負責創建一種產品對象。
    • 抽象工廠模式:工廠接口包含多個創建方法,每個方法負責創建一種產品對象。
  3. 擴展性

    • 工廠方法模式:擴展新的產品時,只需增加新的具體工廠類,但擴展產品族會涉及較多修改。
    • 抽象工廠模式:擴展新的產品族時,只需增加新的具體工廠類,無需修改現有代碼,但擴展新的產品種類時,可能需要修改抽象工廠接口及其所有實現類。
  4. 應用場景

    • 工廠方法模式:適用于產品類型單一,且產品類的創建有較復雜的邏輯或要求延遲到子類的情況。
    • 抽象工廠模式:適用于需要創建一組相關或互相依賴的產品對象,且需要保證這些對象的一致性的情況。
總結

工廠方法模式和抽象工廠模式都是用于創建對象的設計模式,但它們在復雜度和應用場景上有所不同。工廠方法模式適用于單一產品的創建,而抽象工廠模式適用于創建一組相關的產品對象。在實際開發中,選擇合適的模式可以提高代碼的靈活性和可維護性。希望通過這篇文章,你能更好地理解這兩種模式,并在合適的場景中應用它們。

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

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

相關文章

昇思25天學習打卡營第11天|RNN實現情感分類

概述 情感分類是自然語言處理中的經典任務,是典型的分類問題。本節使用MindSpore實現一個基于RNN網絡的情感分類模型,實現如下的效果: 輸入: This film is terrible 正確標簽: Negative 預測標簽: Negative輸入: This film is great 正確標…

Mongodb復合索引

學習mongodb,體會mongodb的每一個使用細節,歡迎閱讀威贊的文章。這是威贊發布的第90篇mongodb技術文章,歡迎瀏覽本專欄威贊發布的其他文章。如果您認為我的文章對您有幫助或者解決您的問題,歡迎在文章下面點個贊,或者關…

【計算機畢業設計】002基于weixin小程序家庭記賬本

🙊作者簡介:擁有多年開發工作經驗,分享技術代碼幫助學生學習,獨立完成自己的項目或者畢業設計。 代碼可以私聊博主獲取。🌹贈送計算機畢業設計600個選題excel文件,幫助大學選題。贈送開題報告模板&#xff…

【實戰:python-Django發送郵件-短信-釘釘通知】

一 Python發送郵件 1.1 使用SMTP模塊發送郵件 import smtplib from email.mime.text import MIMEText from email.header import Headermsg_from 306334678qq.com # 發送方郵箱 passwd luzdikipwhjjbibf # 填入發送方郵箱的授權碼(填入自己的授權碼,相當于郵箱…

鴻蒙語言基礎類庫:【@ohos.uitest (UiTest)】 測試

UiTest UiTest提供模擬UI操作的能力,供開發者在測試場景使用,主要支持如點擊、雙擊、長按、滑動等UI操作能力。 該模塊提供以下功能: [By]:提供控件特征描述能力,用于控件篩選匹配查找。[UiComponent]:代…

實驗四:圖像的銳化處理

目錄 一、實驗目的 二、實驗原理 1. 拉普拉斯算子 2. Sobel算子 3. 模板大小對濾波的影響 三、實驗內容 四、源程序和結果 (1) 主程序(matlab) (2) 函數GrayscaleFilter (3) 函數MatrixAbs 五、結果分析 1. 拉普拉斯濾波 2. Sobel濾波 3. 不同大小模板的濾波…

單點登陸思路及流程

單點登錄(Single Sign-On,簡稱SSO)是一種流行的身份驗證和授權機制,允許用戶通過一次登錄獲得對多個應用程序或系統的訪問權限。實現單點登錄可以提高用戶體驗、簡化用戶管理和減少密碼重復輸入等問題。下面是一種常見的單點登錄實…

昇思25天學習打卡營第7天 | 基于MindSpore的GPT2文本摘要

本次打卡基于gpt2的文本摘要 數據加載及預處理 from mindnlp.utils import http_get# download dataset url https://download.mindspore.cn/toolkits/mindnlp/dataset/text_generation/nlpcc2017/train_with_summ.txt path http_get(url, ./)from mindspore.dataset impor…

以太坊(以太坊solidity合約)

以太坊(以太坊solidity合約) 1,以太坊2,開發名詞解釋(1)錢包(2)Solidity(3)Ether(以太幣)(4)Truffle&#xff…

Redis 7.x 系列【23】哨兵模式

有道無術,術尚可求,有術無道,止于術。 本系列Redis 版本 7.2.5 源碼地址:https://gitee.com/pearl-organization/study-redis-demo 文章目錄 1. 概述2. 工作原理2.1 監控2.2 標記下線2.3 哨兵領袖2.4 新的主節點2.5 通知更新 3. …

請求響應(后端必備)

一、請求 1.簡單參數 原始方式: 在原始的web程序中,獲取請求參數,需要通過HttpServletRequest對象手動獲取 RequestMapping("/simpleParam")public String simpleParam(HttpServletRequest request){String name request.getP…

什么叫價內期權?直接帶你了解期權價內期權怎么使用?!

今天帶你了解什么叫價內期權?直接帶你了解期權價內期權怎么使用?!價內期權是具有內在價值的期權。期權持有人行權時,對看漲期權而言,行權價格低于標的證券結算價格;對看跌期權而言,標的證券結算…

js 請求blob:https:// 圖片

方式1 def get_file_content_chrome(driver, uri):result driver.execute_async_script("""var uri arguments[0];var callback arguments[1];var toBase64 function(buffer){for(var r,nnew Uint8Array(buffer),tn.length,anew Uint8Array(4*Math.ceil(t/…

前端Vue組件化實踐:自定義加載組件的探索與應用

在前端開發領域,隨著業務邏輯復雜度的提升和系統規模的不斷擴大,傳統的開發方式逐漸暴露出效率低下、維護困難等問題。為了解決這些挑戰,組件化開發作為一種高效、靈活的開發模式,受到了越來越多開發者的青睞。本文將結合實踐&…

Java基礎及進階

JAVA特性 基礎語法 一、Java程序的命令行工具 二、final、finally、finalize 三、繼承 class 父類 { //代碼 }class 子類 extends 父類 { //代碼 }四、Vector、ArrayList、LinkedList 五、原始數據類型和包裝類 六、接口和抽象類 JAVA進階 Java引用隊列 Object counter ne…

PostgreSQL行級安全策略探究

前言 最近和朋友討論oracle行級安全策略(VPD)時,查看了下官方文檔,看起來VPD的原理是針對應用了Oracle行級安全策略的表、視圖或同義詞發出的 SQL 語句動態添加where子句。通俗理解就是將行級安全策略動態添加為where 條件。那么PG中的行級安全策略是怎…

搭建基于 ChatGPT 的問答系統

搭建基于 ChatGPT 的問答系統 📣1.簡介📣2.語言模型,提問范式和 token?2.1語言模型?2.2Tokens?2.3Helper function輔助函數(提問范式) 📣3.評估輸入-分類📣4.檢查輸入-審核?4.1審核4.1.1 我…

使用UDP通信接收與發送Mavlink2.0協議心跳包完整示例

1.克隆mavlink源碼 https://github.com/mavlink/mavlink.git 2.進入mavlink目錄,安裝依賴 python3 -m pip install -r pymavlink/requirements.txt 3.生成Mavlink的C頭文件 mavlink % python3 -m pymavlink.tools.mavgen --lang=C --wire-protocol=2.0 --output=generated…

1-5歲幼兒胼胝體的表面形態測量

摘要 胼胝體(CC)是大腦中的一個大型白質纖維束,它參與各種認知、感覺和運動過程。盡管CC與多種發育和精神疾病有關,但關于這一結構的正常發育(特別是在幼兒階段)還有很多待解開的謎團。雖然早期文獻中報道了性別二態性,但這些研究的觀察結果…