設計模式簡述(三)工廠模式

工廠模式

  • 描述
    • 簡單工廠(靜態工廠)
      • 工廠方法模式
    • 抽象工廠
    • 增加工廠管理類
    • 使用

描述

工廠模式用以封裝復雜的實例初始化過程,供外部統一調用

簡單工廠(靜態工廠)

如果對象創建邏輯簡單且一致,可以使用簡單工廠。傳入想要生成的實例類型

public class HumanFactory {public static <T> T getInstance(Class<T> c) {try {return (T) Class.forName(c.getName()).getDeclaredConstructor().newInstance();} catch (Exception e) {throw new RuntimeException("生成對象異常", e);}}
}

工廠方法模式

多種類型產品初始化邏輯不一致時,可以采用不同工廠實例來初始化對應類型的產品
由于每種產品定義了對應的工廠類,因此工廠方法不需要類型參數就非常明確需要創建的實例

  • 聲明工廠抽象定義
public abstract class AbstractProductFactory {public abstract Product createProduct();
}
  • 聲明產品抽象定義
public interface Product {String getName();default void description() {System.out.println("產品名稱:" + getName());}
}
  • 定義具體產品
public class Apple implements Product {@Overridepublic String getName() {return "蘋果";}
}public class Banana implements Product {@Overridepublic String getName() {return "香蕉";}
}
  • 定義產品對應的工廠
public class AppleFactory extends AbstractProductFactory {public Product createProduct() {// 蘋果其他初始化邏輯return new Apple();}
}public class BananaFactory extends AbstractProductFactory {public Product createProduct() {// 香蕉其他初始化邏輯return new Banana();}
}
  • 使用
public static void main(String[] args) {AbstractProductFactory appleFactory = new AppleFactory();Product product = appleFactory.createProduct();product.description();AbstractProductFactory bananaFactory = new BananaFactory();Product banana = bananaFactory.createProduct();banana.description();
}

抽象工廠

以上工廠方法,一個產品就需要一個工廠類。
如果產品本身就有一些共通的地方,我們可以將產品劃分到同一個工廠的不同產品線,這些產品的生產可以共用一些資源。

比如,我的產品都分為大、中、小三種分類。分別進行不同的加工

  • 聲明抽象水果
public interface Fruit {String getName();String getSize();default void description() {System.out.println("產品名稱:" + getSize() + getName());}
}
  • 聲明具體水果
public class BigApple implements Fruit {@Overridepublic String getName() {return "蘋果";}@Overridepublic String getSize() {return "大號";}
}public class MiddleApple implements Fruit {@Overridepublic String getName() {return "蘋果";}@Overridepublic String getSize() {return "中號";}
}public class SmallApple implements Fruit {@Overridepublic String getName() {return "蘋果";}@Overridepublic String getSize() {return "小號";}
}
public class BigBanana implements Fruit {@Overridepublic String getName() {return "香蕉";}@Overridepublic String getSize() {return "大號";}
}public class MiddleBanana implements Fruit {@Overridepublic String getName() {return "香蕉";}@Overridepublic String getSize() {return "中號";}
}public class SmallBanana implements Fruit {@Overridepublic String getName() {return "香蕉";}@Overridepublic String getSize() {return "小號";}
}
  • 聲明抽象工廠
public abstract class AbstractFruitFactory {abstract Fruit bigFruit();abstract Fruit middleFruit();abstract Fruit smallFruit();
}
  • 定義具體工廠
public class AppleFruitFactory extends AbstractFruitFactory{@OverrideFruit bigFruit() {return new BigApple();}@OverrideFruit middleFruit() {return new MiddleApple();}@OverrideFruit smallFruit() {return new SmallApple();}
}
public class BananaFruitFactory extends AbstractFruitFactory {@OverrideFruit bigFruit() {return new BigBanana();}@OverrideFruit middleFruit() {return new MiddleBanana();}@OverrideFruit smallFruit() {return new SmallBanana();}
}

增加工廠管理類

當抽象工廠的子類擴展時,調用方需要和各個子類工廠交互,在一定程度上違反了迪米特法則。
我們可以將工廠子類交由工廠管理類進行管理,調用方只需要和這個管理類交互即可

public final class FruitFactoryManager {private static Map<String, AbstractFruitFactory> register = new HashMap<>();static {register.put("apple", new AppleFruitFactory());register.put("banana", new BananaFruitFactory());}public static AbstractFruitFactory getFactory(String factoryCode) {return register.get(factoryCode);}
}

使用

public class Sample {public static void main(String[] args) {AbstractFruitFactory appleFactory = new AppleFruitFactory();Fruit smallApple = appleFactory.smallFruit();smallApple.description();Fruit middleApple = appleFactory.middleFruit();middleApple.description();Fruit bigApple = appleFactory.bigFruit();bigApple.description();AbstractFruitFactory bananaFactory = new BananaFruitFactory();Fruit smallBanana = bananaFactory.smallFruit();smallBanana.description();Fruit middleBanana = bananaFactory.middleFruit();middleBanana.description();Fruit bigBanana = bananaFactory.bigFruit();bigBanana.description();}
}

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

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

相關文章

批量將 JSON 轉換為 Excel/思維導入等其它格式

json 格式相信對大家來說都不陌生&#xff0c;這是一種輕量級的結構化數據&#xff0c;可以對對象進行描述。json 格式也是一種普通的文本文件格式&#xff0c;用記事本就能夠打開編輯 json 格式的文件&#xff0c;可以很方便的轉換為其他格式。今天要給大家介紹的就是如何將 j…

電腦有時出現檢測不到音箱設備怎么辦?

問題 有時候電腦開機之后就檢測不到音箱&#xff0c;經過我一頓檢查發現是檢測不到聲卡&#xff0c;即使拔插了音箱也沒用&#xff0c;但是當我重啟或者休眠之后再重啟發現就檢測到了 解決方案 方案一 重啟或者休眠之后再開啟 方案二 使用powershell指令將聲卡彈出和載入…

Qwen-Agent框架的文件相關操作:從Assistant到BasicDocQA

在前面的幾篇文章如《針對Qwen-Agent框架的Function Call及ReAct的源碼閱讀與解析&#xff1a;Agent基類篇》 、《基于Qwen-Agent框架的Function Call及ReAct方式調用自定義工具》、 《針對Qwen-Agent框架的源碼閱讀與解析&#xff1a;FnCallAgent與ReActChat篇》中&#xff0c…

RSSI定位程序,N個錨點、三維空間,使用CKF對軌跡進行濾波,附MATLAB代碼的下載鏈接

本文所述的程序實現三維空間中基于RSSI信號的多錨點定位&#xff0c;并采用容積卡爾曼濾波&#xff08;CKF&#xff09;對動態軌跡進行降噪優化。代碼包含完整的定位仿真流程&#xff0c;涵蓋環境建模、信號強度模擬、定位解算、軌跡濾波及可視化分析模塊 文章目錄 程序介紹概述…

開源軟件與自由軟件:一場理念與實踐的交鋒

在科技的世界里&#xff0c;“開源軟件”和“自由軟件”這兩個詞幾乎無人不知。很多人或許都聽說過&#xff0c;它們的代碼是公開的&#xff0c;可以供所有人查看、修改和使用。然而&#xff0c;若要細究它們之間的區別&#xff0c;恐怕不少朋友會覺得云里霧里。今天&#xff0…

C++ - 頭文件基礎(常用標準庫頭文件、自定義頭文件、頭文件引入方式、防止頭文件重復包含機制)

一、頭文件 在 C 中&#xff0c;頭文件&#xff08;.h&#xff09;用于函數聲明、類定義、宏定義等等 在 Visual Studio 中&#xff0c;頭文件通常放在頭文件目錄中&#xff0c;頭文件實現通常放在源文件目錄中 二、常用標準庫頭文件 1、輸入輸出 <iostream> 標準輸入…

CSS 背景屬性學習筆記

一、CSS 背景屬性概述 CSS 背景屬性用于定義 HTML 元素的背景效果&#xff0c;主要包括以下幾種屬性&#xff1a; background-color&#xff1a;定義元素的背景顏色。 background-image&#xff1a;定義元素的背景圖像。 background-repeat&#xff1a;定義背景圖像如何重復…

Qt實現鼠標拖動窗口

Qt實現鼠標拖動窗口 1、設置窗口無邊框2、重寫鼠標點擊&#xff0c;移動函數2.1添加頭文件2.2 重寫函數2.3 添加定義 3、定義一個偏移值4、判斷鼠標左鍵是否按下并計算偏移值5、移動窗口6、.h文件和.cpp文件6.1 .h文件6.2 .cpp文件 7、總結 1、設置窗口無邊框 this->setWin…

MDX語言的數論算法

MDX語言的數論算法探討 引言 數論作為數學的一個重要分支&#xff0c;主要研究整數及其性質。在計算機科學和信息技術領域&#xff0c;數論算法被廣泛應用于密碼學、算法設計、數據加密等領域。MDX&#xff08;Multi-Dimensional Expressions&#xff09;語言&#xff0c;雖然…

【學Rust寫CAD】34 精確 Alpha 混合函數(argb.rs補充方法)

源碼 #[inline]pub fn over_exact(self, dst: Argb) -> Argb {let a 255 - self.alpha32();let t dst.rb() * a 0x80_00_80;let mut rb (t ((t >> 8) & Argb::MASK)) >> 8;rb & Argb::MASK;rb self.rb();// saturaterb | 0x1000100 - ((rb >&…

2025-04-06 NO.2 Quest3 基礎配置與打包

文章目錄 1 場景配置1.1 開啟手勢支持1.2 創建 OVRCameraRig1.3 創建可交互 Cube 2 打包配置 環境&#xff1a; Windows 11Unity6000.0.42f1 Quest3 開發環境配置見 2025-03-17 NO.1 Quest3 開發環境配置教程_quest3 unity 開發流程-CSDN博客。 1 場景配置 1.1 開啟手勢支持 …

LabVIEW提升程序響應速度

LabVIEW 程序在不同計算機上的響應速度可能存在較大差異&#xff0c;這通常由兩方面因素決定&#xff1a;計算機硬件性能和程序本身的優化程度。本文將分別從硬件配置對程序運行的影響以及代碼優化方法進行詳細分析&#xff0c;幫助提升 LabVIEW 程序的執行效率。 一、計算機硬…

Matlab:三維繪圖

目錄 1.三維曲線繪圖命令&#xff1a;plot3 實例——繪制空間直線 實例——繪制三角曲線 2.三維曲線繪圖命令&#xff1a;explot3 3.三維網格命令&#xff1a;mesh 實例——繪制網格面 實例——繪制山峰曲面 實例——繪制函數曲線 1.三維曲線繪圖命令&#xff1a;plot3 …

微信小程序基于Canvas實現頭像圖片裁剪(上)

序言 嘿&#xff0c;打工人混跡職場這么久&#xff0c;圖片處理肯定都沒少碰。不過咱說實話&#xff0c;大部分時候都是直接 “抄近道”&#xff0c;用現成的三方組件&#x1f60f;。就像我&#xff0c;主打一個會用工具&#xff0c;畢竟善用工具可是咱人類的 “超能力”&…

[特殊字符] 使用 Handsontable 構建一個支持 Excel 公式計算的動態表格

在 Web 應用中&#xff0c;處理表格數據并提供 Excel 級的功能&#xff08;如公式計算、數據導入導出&#xff09;一直是個挑戰。今天&#xff0c;我將帶你使用 React Handsontable 搭建一個強大的 Excel 風格表格&#xff0c;支持 公式計算、Excel 文件導入導出&#xff0c;并…

0302useState-hooks-react-仿低代碼平臺項目

文章目錄 1 useState1.1 說明返回 1.2 示例1.3 數據類型 2 state2.1 概述2.2 state特點 3 state重構問卷4 immer結語 1 useState useState 是一個 React Hook&#xff0c;它允許你向組件添加一個 狀態變量。 1.1 說明 語法 const [state, setState] useState(initialState…

前端實現單點登錄(SSO)的方案

概念&#xff1a;單點登錄&#xff08;Single Sign-On, SSO&#xff09;主要是在多個系統、多個瀏覽器或多個標簽頁之間共享登錄狀態&#xff0c;保證用戶只需登錄一次&#xff0c;就能訪問多個關聯應用&#xff0c;而不需要重復登錄。 &#x1f4a1; 方案分類 1. 前端級別 SS…

zabbix監控網站(nginx、redis、mysql)

目錄 前提準備&#xff1a; zabbix-server主機配置&#xff1a; 1. 安裝數據庫 nginx主機配置&#xff1a; 1. 安裝nginx redis主機配置&#xff1a; 1. 安裝redis mysql主機配置&#xff1a; 1. 安裝數據庫 zabbix-server&#xff1a; 1. 安裝zabbix 2. 編輯配置文…

無人機等非合作目標公開數據集2025.4.3

一.無人機遙感數據概述 1.1 定義與特點 在遙感技術的不斷發展中&#xff0c;無人機遙感數據作為一種新興的數據源&#xff0c;正逐漸嶄露頭角。它是通過無人駕駛飛行器&#xff08;UAV&#xff09;搭載各種傳感器獲取的地理空間信息&#xff0c;具有 覆蓋范圍大、綜合精度高、…

大數據時代的隱私保護:區塊鏈技術的創新應用

一、引言 在當今數字化時代&#xff0c;大數據已經成為推動社會發展的關鍵力量。從商業決策到社會治理&#xff0c;從醫療健康到金融服務&#xff0c;數據的價值日益凸顯。然而&#xff0c;隨著數據的大量收集和廣泛使用&#xff0c;隱私保護問題也日益突出。如何在充分利用大…