小張的工廠進化史——工廠模式

小張的工廠進化史——工廠模式

  • 一、簡單工廠模式:全能生產線
  • 二、工廠方法模式:分品牌代工
  • 三、抽象工廠模式:生態產品族
  • 四、三種模式核心對比表
  • 五、結合Spring實現簡單工廠(實踐)

在這里插入圖片描述

小張從華強北起家,最初只有一條組裝線,根據訂單參數(手機/平板)手動切換生產流程。隨著訂單量激增,他經歷了三次產業升級

  1. 階段1全能生產線通過指令切換產品(簡單工廠模式
  2. 階段2:引入代工廠分品牌生產工廠方法模式
  3. 階段3:打造生態產品族統一管理(抽象工廠模式

一、簡單工廠模式:全能生產線

場景:小張初期用一條生產線,通過參數指令生產不同電子產品。
代碼示例:

// 抽象產品:電子設備接口
public interface Device {void boot();
}// 具體產品:手機
public class Phone implements Device {@Overridepublic void boot() { System.out.println("【簡單工廠】手機開機:Android系統啟動");}
}// 具體產品:平板
public class Tablet implements Device {@Overridepublic void boot() { System.out.println("【簡單工廠】平板開機:Android系統啟動");}
}// 簡單工廠類
public class ElectronicsFactory {public static Device createDevice(String type) {if ("phone".equalsIgnoreCase(type)) {return new Phone();} else if ("tablet".equalsIgnoreCase(type)) {return new Tablet();}throw new IllegalArgumentException("不支持的設備類型");}
}// 客戶端調用
public class Client {public static void main(String[] args) {Device phone = ElectronicsFactory.createDevice("phone");phone.boot();  // 輸出:手機開機...}
}

特點:

  • 參數化創建:通過if-else判斷生產設備,違反開閉原則(新增產品需修改工廠類)
  • 適用場景:初期產品線單一(如僅手機和平板)

二、工廠方法模式:分品牌代工

場景:小張引入華為、小米代工廠,各品牌獨立生產設備。
代碼示例:

// 抽象工廠接口
public interface DeviceFactory {Device createDevice();
}// 具體工廠:華為代工廠
public class HuaweiFactory implements DeviceFactory {@Overridepublic Device createDevice() {return new HuaweiPhone();  // 華為手機}
}// 具體產品:華為手機
public class HuaweiPhone implements Device {@Overridepublic void boot() {System.out.println("【工廠方法】華為手機:HarmonyOS啟動");}
}// 客戶端調用
public class Client {public static void main(String[] args) {DeviceFactory factory = new HuaweiFactory();Device phone = factory.createDevice();phone.boot();  // 輸出:華為手機...}
}

特點:

  • 多態擴展:新增品牌(如OPPO)只需添加新工廠類,符合開閉原則
  • 類爆炸:每新增一個品牌需增加2個類(工廠+產品)

三、抽象工廠模式:生態產品族

場景:小張擴展生態鏈,生產同一品牌的多類產品(手機+耳機),確保設計兼容。
代碼示例:

// 抽象工廠接口
public interface BrandFactory {Phone createPhone();Earphones createEarphones();
}// 具體工廠:蘋果生態
public class AppleFactory implements BrandFactory {@Overridepublic Phone createPhone() {return new iPhone();  // 蘋果手機}@Overridepublic Earphones createEarphones() {return new AirPods();  // 蘋果耳機}
}// 關聯產品族
public class iPhone implements Phone {@Overridepublic void boot() {System.out.println("【抽象工廠】iPhone開機:iOS啟動");}
}
public class AirPods implements Earphones {public void connect() {System.out.println("【抽象工廠】AirPods自動配對");}
}// 客戶端調用
public class Client {public static void main(String[] args) {BrandFactory factory = new AppleFactory();factory.createPhone().boot();      // 輸出:iPhone開機...factory.createEarphones().connect(); // 輸出:AirPods自動配對...}
}

特點:

  • 產品族兼容:確保同一品牌風格統一(如蘋果極簡設計)
  • 接口膨脹:新增品牌需實現全套接口(如華為生態需實現createPhone()和createEarphones())

四、三種模式核心對比表

簡單工廠模式工廠方法模式抽象工廠模式
核心目標快速生產單一產品分品牌靈活擴展創建兼容的生態產品族
擴展性? 差(需修改代碼)? 優(新增工廠類)? 差(需實現全套接口)
類復雜度1工廠類 + N產品類N工廠類 + N產品類M工廠類 + M×N產品類
設計原則違反開閉原則符合開閉原則符合接口隔離原則
適用場景初期單一產線(手機/平板)多品牌代工(華為/小米)生態鏈產品(蘋果手機+耳機)

五、結合Spring實現簡單工廠(實踐)

詳細內容可參考:【當模板方法模式遇上工廠模式:一道優雅的烹飪架構設計】

抽象類(或者 接口)

public abstract class AbstractCooking {protected CookEnum cookEnum;protected abstract void aromaBlasting();}

枚舉類

/*** 菜品枚舉類*/
public enum CookEnum {KUNG_PAO_CHICKEN("kungPaoChicken", "宮保雞丁"),MAPO_TO_FU("mapoTofu", "麻婆豆腐");private final String code;private final String name;CookEnum(String code, String name) {this.code = code;this.name = name;}....
}

宮保雞丁

/*** 宮保雞丁*/
@Service
public class KungPaoChicken extends AbstractCooking {public KungPaoChicken() {this.cookEnum = CookEnum.KUNG_PAO_CHICKEN;}@Overrideprotected void aromaBlasting() {System.out.println("蔥姜蒜爆香");}	
}

麻婆豆腐

/*** 麻婆豆腐*/
@Service
public class MapoTofu  extends AbstractCooking {public MapoTofu() {this.cookEnum = CookEnum.MAPO_TO_FU;}@Overrideprotected void aromaBlasting() {System.out.println("煸炒郫縣豆瓣醬+花椒粒");}
}

工廠類

@Service
public class CookFactory implements InitializingBean {// Spring啟動時,會依賴注入 所有的AbstractCooking的bean,注入到cookings@Autowiredprivate List<AbstractCooking> cookings;// 定義Map存儲 bean的映射關系private Map<CookEnum, AbstractCooking> cookingMap = new HashMap<>();public AbstractCooking getCookingByCode(String code) {CookEnum cookEnum = CookEnum.getByCode(code);return cookingMap.get(cookEnum);}// CookFactory的bean對象在初始化階段,動態把 AbstractCooking的所有bean 設置到cookingMap (動態擴展的關鍵)@Overridepublic void afterPropertiesSet() throws Exception {for (AbstractCooking cooking: cookings) {cookingMap.put(cooking.getCookEnum(), cooking);}}
}

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

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

相關文章

Python中的eval()函數詳解

文章目錄 Python中的eval()函數詳解基本語法基本用法安全性問題安全使用建議實際應用場景與exec()的區別性能考慮總結 Python中的eval()函數詳解 eval()是Python的一個內置函數&#xff0c;用于執行字符串形式的Python表達式并返回結果。它是一個強大但需要謹慎使用的函數。 …

銀行業務發展歷史

銀行業務發展歷史 銀行業務的發展可以追溯到古代&#xff0c;但其現代形式的發展可以追溯到中世紀。以下是銀行業務發展的主要歷史階段&#xff1a; 1. 古代和中世紀時期 特點&#xff1a;商人提供貸款和存款服務&#xff0c;充當中間人轉移資金&#xff0c;發行紙幣作為支付…

SQL實戰篇,數據庫在Kooboo中的實際應用(一)

本文將結合實際操作與代碼示例&#xff0c;展示SQL 在 Kooboo 中的實際應用 僅需兩步&#xff1a;動態創建表 基礎查詢&#xff0c;無需復雜配置&#xff0c;快速上手&#xff01; 一、動態創建表&#xff1a;插入數據 Kooboo 支持多種數據庫&#xff0c;以 SQLite 為例&…

克魔助手(Kemob)安裝與注冊完整教程 - Windows/macOS雙平臺指南

iOS設備管理工具克魔助手便攜版使用全指南 前言&#xff1a;為什么需要專業的iOS管理工具 在iOS開發和設備管理過程中&#xff0c;開發者經常需要突破系統限制&#xff0c;實現更深層次的控制和調試。本文將詳細介紹一款實用的便攜式工具的使用方法&#xff0c;幫助開發者快速…

搜索插入位置 -- 二分查找

目錄 一&#xff1a;題目 二:算法原理 三&#xff1a;代碼分析 一&#xff1a;題目 題目鏈接&#xff1a;35. 搜索插入位置 - 力扣&#xff08;LeetCode&#xff09; 二:算法原理 三&#xff1a;代碼分析 class Solution { public:int searchInsert(vector<int>&am…

Apache Doris內存與超時參數配置詳解

一、查詢任務內存限制調整 1. ?默認內存限制與問題定位 Apache Doris默認限制單個BE節點上的查詢任務內存使用不超過2GB&#xff08;即exec_mem_limit2147483648字節&#xff09;。當復雜查詢或大規模數據操作超過此限制時&#xff0c;會觸發Memory limit exceeded錯誤。通過…

龍虎榜——20250411

今天縮量&#xff0c;上方壓力依然在&#xff0c;外圍還在升級&#xff0c;企穩還需要時日。 2025年4月11日龍虎榜行業方向分析 一、核心主線方向 半導體與芯片&#xff08;國產替代加速&#xff09; ? 代表標的&#xff1a;圣邦股份&#xff08;模擬芯片&#xff09;、中電…

若依前后端分離版本從mysql切換到postgresql數據庫

一、修改依賴&#xff1a; 修改admin模塊pom.xml中的依賴,屏蔽或刪除mysql依賴&#xff0c;增加postgresql依賴。 <!-- Mysql驅動包 --> <!--<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId> &l…

自定義排序注意點

這段 Java 代碼展示了兩種排序方式的用法&#xff0c;分別是&#xff1a; 對普通數組進行排序&#xff08;Integer[] nums&#xff09;對對象數組進行排序&#xff08;Student[] students&#xff09; 我來一步步給你講清楚&#xff1a; ? 第1部分&#xff1a;普通數組降序排…

第十四屆藍橋杯大賽軟件賽省賽C/C++ 大學 A 組真題

文章目錄 1 幸運數題目描述&#xff1a;答案&#xff1a;4430091 代碼&#xff1a; 2 有獎問答題目描述&#xff1a;重點&#xff1a;答案&#xff1a;8335366 代碼&#xff1a; 3 平方差題目描述&#xff1a;思路&#xff1a;數學找規律代碼&#xff1a; 4 更小的數題目描述&a…

C++ 入門四:類與對象 —— 面向對象編程的核心基石

一、類的定義 1. 類的基本形式 class 類名 { public: // 公有成員&#xff08;類內外均可訪問&#xff09;數據類型 數據成員; // 公有數據成員數據類型 成員函數(參數列表); // 公有成員函數聲明 protected: // 保護成員&#xff08;類內和派生類可訪問&…

嵌入式---電機分類

一、按電流類型分類&#xff08;最基礎分類&#xff09; 1. 直流電機&#xff08;DC Motor&#xff09; 工作原理&#xff1a;通過換向器&#xff08;有刷&#xff09;或電子換向&#xff08;無刷&#xff09;將直流電源轉換為交變磁場&#xff0c;驅動轉子旋轉。 核心特點&a…

【python】并行編程模塊:threading / mutliprocess / parallel / Celery

在并行編程中&#xff0c;Python 具有簡化實現的內置和外部模塊。 本書是基于Python3.X的。 Python的threading模塊 Python的threading模塊為模塊 _thread 提供了一個抽象層&#xff0c;它是一個較低級別的模塊。 它提供的功能可以幫助程序員完成基于線程開發并行系統的艱巨任…

OpengGL教程(七)---攝像機

本章參考官方教程&#xff1a;攝像機 本系列歷史文 OpengGL教程(一)—OpenGL環境的配置(GLFW3,GLAD) OpengGL教程(二)—渲染一個簡單的窗體 OpengGL教程(三)—使用VAO和VBO方式繪制三角形 OpengGL教程(四)—使用EBO方式繪制矩形 OpengGL教程(五)—紋理的應用 OpengGL教程(六)—…

安卓手機怎樣開啟雙WiFi加速

1. 小米/Redmi手機 路徑&#xff1a; 設置 → WLAN → 高級設置 → 雙WLAN加速 操作&#xff1a; 開啟功能后&#xff0c;可同時連接一個2.4GHz WiFi和一個5GHz WiFi&#xff08;或兩個不同路由器&#xff09;。 可選擇“智能選擇”或手動指定輔助網絡。 2. 華為/榮耀手機…

什么是八步工作法?

八步工作法&#xff0c;顧名思義&#xff0c;就是把一項工作拆分成八個步驟來完成。它的核心目的是讓工作變得更有條理&#xff0c;更高效&#xff0c;避免忙而無序&#xff0c;做到事事有著落&#xff0c;件件有結果。這個方法在很多企業和單位中都有應用&#xff0c;尤其適合…

前端Node.js的包管理工具npm指令

?npm&#xff08;Node Package Manager&#xff09;是Node.js的包管理工具&#xff0c;主要用于安裝、更新、刪除和管理JavaScript包。以下是前端開發中常用的npm命令及其用途?&#xff1a; 基本命令 npm提供了一系列命令行工具&#xff0c;用于執行各種包管理操作。以下是一…

掌握C語言文件操作:從理論到實戰指南

文件操作是C語言編程中不可或缺的一部分&#xff0c;它使得程序能夠持久化存儲數據&#xff0c;并在需要時高效讀寫。本文將從基礎概念到實戰技巧&#xff0c;系統講解C語言文件操作的核心知識點&#xff0c;并結合代碼示例幫助讀者深入理解。 一. 為什么需要文件操作&#xf…

Linux 線程:從零構建多線程應用:系統化解析線程API與底層設計邏輯

線程 線程的概述 在之前&#xff0c;我們常把進程定義為 程序執行的實例&#xff0c;實際不然&#xff0c;進程實際上只是維護應用程序的各種資源&#xff0c;并不執行什么。真正執行具體任務的是線程。 那為什么之前直接執行a.out的時候&#xff0c;沒有這種感受呢&#xf…

014_多線程

多線程 多線程創建線程方式一&#xff1a;繼承Thread類方式二&#xff1a;實現Runable接口方式三&#xff1a;實現Callbale接口 Thread的常用方法線程安全線程同步方式一&#xff1a;同步代碼塊同步方法方式三&#xff1a;Lock鎖 線性池創建線程池處理Runnable任務處理Callable…