Java設計模式之《工廠模式》

目錄

1、介紹

1.1、定義

1.2、優缺點

1.3、使用場景

2、實現

2.1、簡單工廠模式

2.2、工廠方法模式

2.3、抽象工廠模式

3、小結


前言

????????在面向對象編程中,創建對象實例最常用的方式就是通過 new 操作符構造一個對象實例,但在某些情況下,new 操作符直接生成對象會存在一些問題。

舉例來說,對象的創建需要一系列的步驟:

????????可能需要計算或取得對象的初始位置、選擇生成哪個子對象實例、或在生成之前必須先生成一些輔助對象。

???????? 在這些情況,新對象的建立就是一個 “過程”,而不僅僅是一個操作,就像一部大機器中的一個齒輪傳動。

????????工廠模式是一種創建型設計模式,它提供了一種創建對象的最佳方式,而無需指定具體的實現類。

Java設計模式分類,如下所示:


1、介紹

1.1、定義

?????????工廠模式將目的將創建對象的具體過程屏蔽隔離起來,從而達到更高的靈活性。

如下所示:

工廠模式可以分為三類:

  1. 簡單工廠模式(Simple Factory)
  2. 工廠方法模式(Factory Method)
  3. 抽象工廠模式(Abstract Factory)

1、在沒有工廠的時代:

如果客戶需要一款寶馬車,那么就需要客戶去創建一款寶馬車,然后拿來用。

2、簡單工廠模式:

????????后來出現了工廠,用戶不再需要去創建寶馬車,由工廠進行創建,想要什么車,直接通過工廠創建就可以了。比如想要320i系列車,工廠就創建這個系列的車。

3、工廠方法模式:

????????為了滿足客戶,寶馬車系列越來越多,如320i、523i等等系列,一個工廠無法創建所有的寶馬系列,于是又單獨分出來多個具體的工廠,每個具體工廠創建一種系列,即具體工廠類只能創建一個具體產品。但是寶馬工廠還是個抽象,你需要指定某個具體的工廠才能生產車出來。

4、抽象工廠模式:

????????隨著客戶要求越來越高,寶馬車必須配置空調,于是這個工廠開始生產寶馬車和需要的空調。最終是客戶只要對寶馬的銷售員說:我要523i空調車,銷售員就直接給他523i空調車了。而不用自己去創建523i空調車寶馬車。

1.2、優缺點

  • 將對象的創建與使用分離。

  • 降低系統的耦合度。

  • 便于擴展新的產類型。

1.3、使用場景

  1. 如果只是創建單個對象的不同實現(如不同的數據庫連接),用工廠方法。

  2. 如果需要創建配套的一組對象(如不同操作系統的UI組件套件),用抽象工廠


2、實現

2.1、簡單工廠模式

// 產品接口
interface Product {void use();
}// 具體產品A
class ConcreteProductA implements Product {@Overridepublic void use() {System.out.println("Using Product A");}
}// 具體產品B
class ConcreteProductB implements Product {@Overridepublic void use() {System.out.println("Using Product B");}
}// 簡單工廠
class SimpleFactory {public static Product createProduct(String type) {if ("A".equals(type)) {return new ConcreteProductA();} else if ("B".equals(type)) {return new ConcreteProductB();}throw new IllegalArgumentException("Unknown product type");}
}// 使用示例
public class Main {public static void main(String[] args) {Product productA = SimpleFactory.createProduct("A");productA.use();  // 輸出: Using Product AProduct productB = SimpleFactory.createProduct("B");productB.use();  // 輸出: Using Product B}
}

2.2、工廠方法模式

相比較于抽象工廠模式,可以對接口的實現縱向擴展。

// 產品接口
interface Engine {void start();
}// 具體產品
class ElectricEngine implements Engine {public void start() { System.out.println("電動機啟動"); }
}class FuelEngine implements Engine {public void start() { System.out.println("燃油發動機啟動"); }
}// 工廠接口(只生產發動機)
interface EngineFactory {Engine createEngine();
}// 具體工廠
class ElectricEngineFactory implements EngineFactory {public Engine createEngine() { return new ElectricEngine(); }
}class FuelEngineFactory implements EngineFactory {public Engine createEngine() { return new FuelEngine(); }
}// 使用示例
public class Main {public static void main(String[] args) {EngineFactory ef = new ElectricEngineFactory();Engine engine = ef.createEngine();engine.start(); // 輸出: 電動機啟動}
}

特點

  • 只生產發動機這一種產品

  • 如果要新增空調組件,需要另寫一套空調工廠

2.3、抽象工廠模式

相比于工廠方法模式,抽象工廠模式,可以橫向擴展。

// 產品族接口
interface Engine {void start();
}interface AirConditioner {void cool();
}// 電動系列產品
class ElectricEngine implements Engine {public void start() { System.out.println("電動機啟動"); }
}class ElectricAirConditioner implements AirConditioner {public void cool() { System.out.println("電子變頻空調工作"); }
}// 燃油系列產品
class FuelEngine implements Engine {public void start() { System.out.println("燃油發動機啟動"); }
}class FuelAirConditioner implements AirConditioner {public void cool() { System.out.println("機械壓縮機空調工作"); }
}// 抽象工廠接口(能生產整套組件)
interface CarFactory {Engine createEngine();AirConditioner createAirConditioner();
}// 具體工廠
class ElectricCarFactory implements CarFactory {public Engine createEngine() { return new ElectricEngine(); }public AirConditioner createAirConditioner() { return new ElectricAirConditioner(); }
}class FuelCarFactory implements CarFactory {public Engine createEngine() { return new FuelEngine(); }public AirConditioner createAirConditioner() { return new FuelAirConditioner(); }
}// 使用示例
public class Main {public static void main(String[] args) {CarFactory cf = new ElectricCarFactory();Engine engine = cf.createEngine();AirConditioner ac = cf.createAirConditioner();engine.start();  // 輸出: 電動機啟動ac.cool();      // 輸出: 電子變頻空調工作}
}

特點

  • 一個工廠能生產配套的發動機+空調

  • 保證電動車的發動機和空調是電子化的,燃油車的都是機械化的


3、小結

1、簡單工廠模式

一個工廠類根據傳入的參數決定創建哪種產品類的實例。

2、工廠方法模式

定義一個創建對象的接口,但讓實現這個接口的類來決定實例化哪個類。

3、抽象工廠模式

提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。


參考文章:

1、Java設計模式之創建型:工廠模式詳解(簡單工廠+工廠方法+抽象工廠)_簡單工廠模式,工廠方法模式,抽象工廠模式-CSDN博客https://blog.csdn.net/a745233700/article/details/120253639?ops_request_misc=%257B%2522request%255Fid%2522%253A%252227ffb8b4a369e0e5024f4e17abda46f3%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=27ffb8b4a369e0e5024f4e17abda46f3&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-120253639-null-null.142^v102^pc_search_result_base1&utm_term=%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4187

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

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

相關文章

【異步】js中異步的實現方式 async await /Promise / Generator

JS的異步相關知識 js里面一共有以下異步的解決方案 傳統的回調 省略 。。。。 生成器 Generator 函數是 ES6 提供的一種異步編程解決方案, 語法上,首先可以把它理解成,Generator 函數是一個狀態機,封裝了多個內部狀態。執行 Generator 函數…

JVM字節碼文件結構

Class文件結構class文件是二進制文件,這里要介紹的是這個二級制文件的結構。思考:一個java文件編譯成class文件,如果要描述一個java文件,需要哪些信息呢?基本信息:類名、父類、實現哪些接口、方法個數、每個…

11.web api 2

5. 操作元素屬性 5.1操作元素常用屬性 :通過 JS 設置/修改標簽元素屬性,比如通過 src更換 圖片最常見的屬性比如: href、title、src 等5.2 操作元素樣式屬性 :通過 JS 設置/修改標簽元素的樣式屬性。使用 className 有什么好處&a…

java中數組和list的區別是什么?

在Java中,數組(Array)和List(通常指java.util.List接口的實現類,如ArrayList、LinkedList)是兩種常用的容器,但它們在設計、功能和使用場景上有顯著區別。以下從核心特性、使用方式等方面詳細對…

Python爬取推特(X)的各種數據

🌟 Hello,我是蔣星熠Jaxonic! 🌈 在浩瀚無垠的技術宇宙中,我是一名執著的星際旅人,用代碼繪制探索的軌跡。 🚀 每一個算法都是我點燃的推進器,每一行代碼都是我航行的星圖。 &#x…

Oracle數據庫文件管理與空間問題解決指南

在Oracle數據庫運維中,表空間、數據文件及相關日志文件的管理是保障數據庫穩定運行的核心環節。本文將系統梳理表空間與數據文件的調整、關鍵文件的移動、自動擴展配置,以及常見空間不足錯誤的排查解決方法,為數據庫管理員提供全面參考。 一、…

華為實驗綜合小練習

描述: 1 內網有A、B、C 三個部門。所在網段如圖所示。 2 內網服務器配置靜態IP,網關192.168.100.1。 3 sw1和R1之間使用vlan200 192.168.200.0/30 互聯。 4 R1向運營商申請企業寬帶并申請了5個公網IP:200.1.1.1-.5子網掩碼 255.255.255.248,網…

Flink面試題及詳細答案100道(1-20)- 基礎概念與架構

《前后端面試題》專欄集合了前后端各個知識模塊的面試題,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs&…

爬蟲逆向之滑塊驗證碼加密分析(軌跡和坐標)

本文章中所有內容僅供學習交流使用,不用于其他任何目的。否則由此產生的一切后果均與作者無關!在爬蟲開發過程中,滑塊驗證碼常常成為我們獲取數據的一大阻礙。而滑塊驗證碼的加密方式多種多樣,其中軌跡加密和坐標加密是比較常見的…

微信小程序實現導航至目的地

本人做的導航頁面相關功能和效果的代碼 javascript相關 Page({data: {markers: [],latitude: , // 中心點坐標longitude: ,FIXED_LAT: 31.2304, // 1. 寫死的目標點坐標, 示例:上海人民廣場FIXED_LNG: 121.4737},onLoad: function () {// 如果要顯示地圖可以看onLo…

中國科學社簡史

中國科學社簡史中國科學社,作為中國近代史上第一個民間綜合性科學團體,為中國現代科學文化事業的發展做出了卓越貢獻。其歷程不僅見證了中國科學從萌芽到蓬勃發展的轉變,還反映了中國科學體制化的艱難探索與輝煌成就。中國科學社的起源可追溯…

若爾當型,Jordon Form

文章目錄一、相似二、若爾當型1.1 認識若爾當型1.2 凱萊-哈密頓定理 (Cayley-Hamilton Theorem)一、相似 Every matrix CB?1ABC B^{-1}ABCB?1AB has the same eigenvalues as A. These C’s are similar to A. 任意一個矩陣C,滿足 CB?1ABC B^{-1}ABCB?1AB 都和…

解決uni-app微信小程序編譯報錯:unexpected character `1`

問題原因在uni-app微信小程序開發中&#xff0c;當template模板中包含英文符號<或>時&#xff0c;微信小程序的編譯器會將這些符號誤認為是HTML標簽的開閉符號&#xff0c;從而導致類似unexpected character 1的編譯錯誤。錯誤示例<view class"plan-bmi">…

[Linux] RAID存儲技術

目錄 RAID實現方式 RAID 0 RAID 1 RAID 5 RAID 10 管理RAID0 創建RAID 查看RAID 格式化和掛載 刪除RAID 管理RAID1 創建RAID 查看RAID 格式化和掛載 增加熱備盤 模擬故障 刪除故障磁盤 刪除RAID 管理RAID5 創建RAID 查看RAID md5設備劃分分區 RAID實現方…

程序設計|C語言教學——C語言基礎4:進階

一、預處理指令預處理指令在編譯前執行&#xff0c;除了#include&#xff0c;還有以下常用指令&#xff1a;1. #define 宏定義無參宏&#xff1a;定義常量或代碼片段&#xff0c;編譯時直接替換&#xff08;無類型檢查&#xff09;。#define PI 3.1415926 // 定義常量 #define…

數據結構之heap算法

文章目錄前言1. heap結構概述2. push_heap3. pop_heap4. sort_heap5. make_heap前言 heap這種數據結構&#xff0c;允許用戶以任何次序將任何數據放入該結構中&#xff0c;但是最后取出數據的時候一定是權值最高&#xff08;或者最低&#xff09;的元素。主要和實現有關&#x…

MCU 軟件斷點調試注意事項!!!

——為什么調試器會在運行中改我的Flash程序&#xff1f;調試單片機時&#xff0c;很多人都有這樣的疑問&#xff1a;明明我在調試前刷進去的固件是好的&#xff0c;為什么加了一個斷點之后&#xff0c;調試器居然去改了 Flash&#xff1f; 如果我拔掉調試器&#xff0c;這個固…

啟發式合并 + 莫隊 戀戀的心跳大冒險

題目來源&#xff1a;2025 Wuhan University of Technology Programming Contest 比賽鏈接&#xff1a;Dashboard - 2025 Wuhan University of Technology Programming Contest - Codeforces 題目大意&#xff1a; Solution&#xff1a; 首先肯定要預處理出以每個節點為起點…

JCTools 無鎖并發隊列基礎:ConcurrentCircularArrayQueue

ConcurrentCircularArrayQueue ConcurrentCircularArrayQueue 是一個抽象類&#xff0c;它為基于數組的并發循環隊列提供了基礎功能。從其命名可以看出幾個關鍵特性&#xff1a;??Concurrent??&#xff1a;常指無鎖并發。??Circular Array??&#xff1a;內部使用循環數…

力扣(LeetCode) ——622. 設計循環隊列(C語言)

題目&#xff1a;622. 設計循環隊列示例1&#xff1a; MyCircularQueue circularQueue new MyCircularQueue(3); // 設置長度為 3 circularQueue.enQueue(1); // 返回 true circularQueue.enQueue(2); // 返回 true circularQueue.enQueue(3); // 返回 true circularQueue.…