設計模式(2)工廠方法模式

一、

1、介紹:定義一個用于創建對象的接口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類。簡單工廠模式的最大優點在于工廠類中包含了必要的邏輯判斷,根據客戶端的選擇條件動態實例化相關的類,對于客戶端來說,去除了與具體產品的依賴。工廠方法模式也即將簡單工廠模塊的Factory工廠類拆成接口,再定義具體的工廠子類去實現。

2、結構圖

?3、代碼

/*** 虛擬工廠類* 給具體的工廠類提供虛擬方法*/
abstract class AbstractFactory {// 表示創建產品的方法,此處使用的是通過具體的產品類的Class來確定需要創建的產品// 也可以通過String等其他方式來指定public abstract <T extends AbstractProduct> T create(Class<T> tClass);}
/*** 具體工廠類* 繼承虛擬工廠類,提供真正的創建對象的方法的實現*/
class CommonFactory extends AbstractFactory{@Override // 對虛擬工廠類的方法進行重寫public <T extends AbstractProduct> T create(Class<T> tClass) {T product = null; // 創建一個null對象作為初始化,使catch到異常后也能有null返回作為結果try {// 明明這樣就可以實現,但是書里寫的更加復雜// (T)Class.forName(tClass.getName()).newInstance()// 暫時對此感到不解product = tClass.newInstance(); // 通過反射創建新的對象} catch (Exception e) {e.printStackTrace();}return product;}
}
/*** 虛擬產品類* 對產品類的屬性以及方法做好規范* 如果有所有具體產品類都通用的方法也可以直接實現*/
abstract class AbstractProduct {/*** 通用方法*/public void method1() {System.out.println("所有產品都會這么做");}/*** 每個產品實現各異的方法*/public abstract void method2();
}
/*** 具體產品類* 繼承虛擬產品類,在虛擬產品類提供的默認方法外,具體實現虛擬類中規定的虛擬方法*/
class Product extends AbstractProduct {@Overridepublic void method2() {System.out.println("這是一個具體的產品類的特性");}
}
class Client {public static void main(String[] args) {AbstractFactory factory = new CommonFactory();AbstractProduct product = factory.create(Product.class);product.method1();product.method2();}
} 

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

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

相關文章

odoo-034 float 浮點數比較

文章目錄 前提問題解決總結 前提 odoo 版本&#xff1a;13 python&#xff1a;3.6.9 問題 比較銷售訂單行中已送貨跟已開票&#xff0c;在 tree 視圖顯示搜索后的結果。發現搜索條件為已送貨 > 已開票時&#xff0c;結果中會包含已送貨已開票的。 解決 把這兩個值打印出…

LeNet中文翻譯

Gradient-Based Learning Applied to Document Recognition 基于梯度的學習應用于文檔識別 摘要 使用反向傳播算法訓練的多層神經網絡構成了成功的基于梯度的學習技術的最佳示例。給定適當的網絡架構&#xff0c;基于梯度的學習算法可用于合成復雜的決策表面&#xff0c;該決策…

【Vue-Router】使用 prams 路由傳參失效

報錯信息&#xff1a; [Vue Router warn]: Discarded invalid param(s) “name”, “price”, “id” when navigating. list.json {"data": [{"name": "面","price":300,"id": 1},{"name": "水",&quo…

node獲取微信小程序登錄用戶的openid

前提準備&#xff1a; 1、需要知道AppID(小程序ID) 2、AppSecret(小程序密鑰) 3、調wx.login成功后返回的code 代碼如下&#xff1a; const express require(express); const router express.Router(); const request require(request) const APP_URL https://api.wei…

考研408 | 【計算機網絡】 網絡層

導圖 網絡層&#xff1a; 路由器功能&#xff1a;轉發&路由選擇 數據平面 數據平面執行的主要功能是根據轉發表進行轉發&#xff0c;這是路由器的本地動作。 控制平面 1.傳統方法/每路由器法&#xff1a; 2.SDN方法&#xff08;Software-Defined Networking) 控制平面中的…

C++并發多線程--多個線程的數據共享和保護

目錄 1--創建并等待多個線程 2--數據共享 2-1--數據只讀 2-2--數據讀寫 2-3--共享數據保護簡單案例 1--創建并等待多個線程 創建多個線程時&#xff0c;可以使用同一個線程入口函數&#xff1b; 多個線程的執行順序與操作系統的調度機制有關&#xff0c;并不和創建線程的先…

html實現商品圖片放大鏡,html圖片放大鏡預覽

效果 實現 復制粘貼&#xff0c;修改圖片路徑即可使用 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>商品圖片放大鏡</title></head><style>body {margin: 0;padding: 0;}#app {padding: 10px;posit…

關于青少年學習演講與口才對未來的領導力的塑造的探析

標題&#xff1a;青少年學習演講與口才對未來領導力的塑造&#xff1a;一項探析 摘要&#xff1a; 本論文旨在探討青少年學習演講與口才對未來領導力的塑造的重要性和影響。通過分析演講和口才對青少年的益處&#xff0c;以及如何培養這些技能來促進領導力的發展&#xff0c;我…

Harmony創建項目ohpm報錯

Harmony創建FA模型的項目時報如下錯&#xff1a; The registry is empty - edit .ohpmrc file or use "ohpm config set registry your_registry" command to set registry.解決方法&#xff1a; File -> Settings -> Build,Execution,Deployment -> Ohpm …

機器學習基礎(五)

決策樹 決策樹是一種預測模型,它代表著對象屬屬性與對象值之間的一種映射關系。樹中的每個節點代表一個對象,分叉路徑(或者叫樹枝)則代表一個屬性值。 決策樹常用方法: 分類樹分析,是一種監督學習,用于預計結果可能為離散類型。 回歸樹分析,用于預計結果為實數。 CART,…

Mysql事務及其隔離機制/隔離級別

mysql事務特性是什么&#xff1f; 原子性(atomicity)&#xff1a;一個事務必須視為一個不可分割的最小工作單元&#xff0c;整個事務中的所有操作要么全部提交成功&#xff0c;要么全部失敗回滾&#xff0c;對于一個事務來說&#xff0c;不可能只執行其中的一部分操作&#xf…

docker可視化工具Portainer

1:Portainer簡介 Portainer是一個docker可視化管理工具&#xff0c;可以非常方便地管理docker鏡像容器。官網地址&#xff1a;https://www.portainer.io/ 注&#xff1a;現在Portainer有BE&#xff08;收費&#xff09;和CE&#xff08;免費&#xff09;版本&#xff0c;安裝的…

【音視頻、chatGpt】h5頁面最小化后,再激活后視頻停住問題的解決

目錄 現象 觀察 解決 現象 頁面有時候要切換&#xff0c;要最小化&#xff1b;短時間或者幾個小時內切換回來&#xff0c;視頻可以正常續上&#xff1b;而放置較長時間&#xff0c;幾個小時或者一晚上&#xff0c;切換回來后&#xff0c;視頻可能卡死 觀察 切換頁面&#x…

【解讀Spikingjelly】使用單層全連接SNN識別MNIST

原文檔&#xff1a;使用單層全連接SNN識別MNIST — spikingjelly alpha 文檔 代碼地址&#xff1a;完整的代碼位于activation_based.examples.lif_fc_mnist.py GitHub - fangwei123456/spikingjelly: SpikingJelly is an open-source deep learning framework for Spiking Neur…

【自用】終端設備(ESP32-S3)連接云服務器 HomeAssistant + MQTT 物聯網平臺

總覽 1.流程概述 2.開始搭建&#xff01; 3. 一、流程概述 0.總體流程 二、開始搭建 1.下載 MQTTX 客戶端&#xff08; 在PC上 &#xff09; https://mqttx.app/zh/downloads 2.新建 MQTTX 連接 0.點擊左側的加號&#xff0c;開始新建連接。 一共需要填寫幾個參數&#…

會玩這 10 個 Linux 命令,一定是個有趣的 IT 男!

Linux當中有很多比較有趣的命令&#xff0c;可以動手看看&#xff0c;很簡單的。 1.rev命令 一行接一行地顛倒所輸入的字符串。 運行&#xff1a; $rev如輸入&#xff1a;shiyanlou shiyanlou2.asciiview命令 1.先安裝aview $sudo apt-get install aview2.再安裝imagema…

vue中封裝自動計算比例滑塊

此插件為另一位漂亮的前端同事小姐姐封裝,覺得非常好用于是決定記載下來,便于復用 如圖需要動態傳入需要分配權重的數組,平均分配可以自動將100%平均分給數組中的值 如果手動拖拽,則會自動計算可拖動最大區域,便于最終總權重必定為100% <el-alert class"merge-alert&…

zookeeper常用命令

zookeeper常用命令 1. 下載安裝2. 配置說明2.1 配置 3. zookeeper的常見命令3.1 server端啟動停止等命令3.2 客戶端連接等命令3.3 客戶端簡單常用命令3.3.1 查看目錄&#xff08;查看數據結構&#xff09;3.3.2 刪除目錄3.3.3 創建目錄3.3.4 創建目錄并寫入值 查看節點值3.3.5…

Apache JMeter:完全指南

Apache JMeter 是一款開源的性能測試工具&#xff0c;可以用于測試 Web 應用程序、FTP 服務器、數據庫等各種類型的服務器。本文將以 JMeter 5.5 為例介紹 JMeter 的使用方法。 下載和安裝 由于 JMeter 是使用 Java 開發的&#xff0c;因此在運行之前必須先安裝 JDK。您可以在…

Android中tools屬性的使用

參考&#xff1a; 1.Android:Tools命名空間原來是有大用處的 2.Android中tools屬性的使用 3.工具屬性參考文檔 4. 命名空間介紹 5. 注解 6. lint 7. 資源壓縮shrink-resources 目錄 一、概述二、引入tools命名空間三、tools 命名空間的作用有哪些&#xff1f;四、tools 命名空間…