【設計模式】 工廠方法模式

系列文章目錄

文章目錄

  • 系列文章目錄
    • 需要了解工廠制造細節嗎?
    • 簡單工廠模式實現
    • 工廠方法模式的實現
    • 簡單方法? 工廠方法?
  • 總結


需要了解工廠制造細節嗎?

我們在前面的文章中為大家介紹了簡單工廠模式,我們知道 簡單工廠模式是最基本的創建實例相關的設計模式, 但是在真實情況中,有更多復雜的情況需要處理。簡單工廠生成實例的類,知道了太多的細節,這就導致這個類很容易出現難維護、靈活性差的問題。

現實中我們要想過好生活,是不太需要也不太可能知道所有細節的。比如說,我們知道豬長什么樣子,也知道紅燒肉很好吃,但一頭豬是通過怎么樣的過程變成紅燒肉的呢?我們并不需要關注。所以如果將來能生產出這樣一臺機器,送進去的是豬,出來的就是紅燒肉,貌似就好多了。

在我們的程序中,確實存在封裝實例創建過程的模式----工廠方法模式,這個模式可以讓創建實例的過程封裝到工廠類中, 避免耦合,它與簡單工廠模式是一個體系的。

簡單工廠模式實現

下面我們以簡單工廠模式的計算器為例,工廠類和客戶端代碼如下:

 public class OperationFactory{public static Operation createOperate(String operate){Operation oper = null;switch(operate){case "+":oper = new Add();break;case "-":oper = new Sub();break;case "*":oper = new Mul();break;case "/":oper = new Div();break;}return oper;}}public static void main(String[] args) {Operation oper = OperationFactory.createOperate(strOperate);double result = oper.getResult(numberA,numberB);}

工廠方法模式的實現

如果換成工廠方法模式寫這個計算器,代碼如下:

public interface IFactory{public Operation createOperation();}public class AddFactory implements IFactory{@Overridepublic Operation createOperation() {return new Add();}} public class SubFactory implements IFactory{@Overridepublic Operation createOperation() {return new Sub();}}public class MulFactory implements IFactory{@Overridepublic Operation createOperation() {return new Mul();}}public class DivFactory implements IFactory{@Overridepublic Operation createOperation() {return  new Div();}}//此時我們的OperationFactory類代碼public class OperationFactory{public static Operation createOperation(String operate){IFactory factory = null;Operation oper = null;switch(operate){case "+":factory = new AddFactory();break;case "-":factory = new SubFactory();break;case "*":factory = new MulFactory();break;case "/":factory = new DivFactory();break;}oper = factory.createOperation();return oper;}}

簡單方法? 工廠方法?

以前我們說過,如果我們現在需要增加其他運算,比如求x的n次方,或者求以a為底b的對數,這些功能的增加哎,在簡單工廠里,我們是先去加求x的n次方運算指數類,然后去更改OperationFactory類,當中加Case語句分支判斷即可,現在用了工廠方法,加指數運算沒問題,去改OperationFactory類的分支也沒問題,但又增加了一個指數工廠類,這不等于不但沒有降低難度,反而增加類,把復雜性增加了嗎?

簡單工廠模式的最大優點在于工廠類中包含必要的邏輯判斷,根據客戶端的選擇條件動態的實例化相關的類,對于客戶端來說,去除了與具體產品的依賴。 就像計算器這個實例,讓客戶端不用管應該用哪個類的實例,只需要把“+”給工廠,工廠就自動的給出了相應的實例,客戶端只需要去運算就可以了。但是我們要增加一個X的n次方的操作的話,我們需要給OperationFactory類的方法里加Case條件,這就是說,我們不但對擴展開放了,對修改也開放了,這違背了開放-封閉原則。 也就是說這個OperationFactory類承載了太多功能。

但是在我們上述的工廠方法中好像也沒有做到這一點,他比原來多出了四個運算工廠類和一個工廠接口,其實是因為我們上述代碼并沒有體現工廠模式的優點,舉個例子:我們公司原來只有一家工廠,生產四種不同的產品。后來發展比較好,需要增加兩種產品放在另一個地方開設新的工廠,新的工廠不應該影響原來工廠的運作。這樣我們只需總公司那里再增加一下協調管理部門就好了。

就編程而言,我們應該盡量將長的代碼分派切割成小段,再將每一小段‘封裝’起來,減少每段代碼之間的耦合,這樣風險就分散了,需要修改或擴展的難度就降低了。 加減乘除四個類算是一個工廠的產品,不妨叫他們(基礎運算工廠)類,現在增加指數、對數運算類,如果算是另一種工廠的兩種產品,不妨稱他們為‘高級運算工廠’類,就沒必要去影響原有的基礎運算工廠運作了。

代碼實現:

public class Pow extends Operation {public double getResult(double numberA,double numberB){return Math.pow(numberA,numberB);}
}public class Log extends Operation{public double getResult(double numberA,double numberB){return Math.log(numberB)/Math.log(numberA);}
}
public interface IFactory {public Operation createOperation();
}
//基礎運算工廠類
public class basicFactory implements IFactory{public Operation createOperation(String operate) {IFactory factory = null;Operation oper = null;switch(operate){case "+" :factory = new AddFactory();break;case "-":factory = new SubFactory();break;case "*":factory = new MulFactory();break;case "/" :factory = new DivFactory();break;}oper = factory.createOperation();return oper;}
}
//高級運算工廠類
public class AdvancedOperationFactory implements IFactory{@Overridepublic Operation createOperation(String operType) {Operation oper = null;switch(operType){case "pow":oper = new Pow();break;case "log":oper = new Log();break;}return oper;}
}public class OperationFactory {public static Operation createOperate(String strOperate) {Operation oper = null;IFactory factory = null;switch (strOperate) {case "+":case "-":case "*":case "/":factory = new basicFactory();break;case "pow":case "log":factory = new AdvancedOperationFactory();break;}oper = factory.createOperation();return oper;}
}

這里我們新的OperationFactory類已經不存在運算子類實例化的代碼了,也就是說,在這個代碼里,全部都是借口與具體工廠類,并不存在具體的實現,與原來的OperationFactory類對比實例化的過程延遲到了工廠子類中。這里也是依賴倒轉原則中的針對接口編程,不要針對實現編程。 注意到關鍵詞 – 延遲到子類

工廠方法模式,定義一個用于創建對象的接口,讓子類決定實例化哪一個類,工廠方法使一個類IDE實例化延遲到其子類

工廠方法克服了簡單工廠違背開放-封閉原則的缺點,同樣保持了封裝對象創建過程的優點。工廠方法模式是簡單工廠模式的進一步抽象和推廣。 由于使用了多態性,工廠方法模式保持了簡單工廠模式的優點克服了他的缺點。另外工廠方法模式本質就是對獲取對象過程的抽象。

工廠模式好處:

  • 對于復雜的參數構造對象,可以很好的對外層屏蔽代碼的復雜性,注意這里是指創建實例的構造對象。
  • 工廠方法模式有很好的解耦能力,這就是針對接口在編程,當我們要修改具體實現層的代碼時,上層代碼完全不了解實現層的情況,因此不會影響到上層代碼的調用。達到解耦目的。

總結

以上就是本文全部內容,本文主要向大家介紹了設計模式中的工廠模式,通過對計算器簡單工廠模式代碼的修改擴展,一步一步引出工廠方法模式的代碼,介紹工廠方法模式的優點和適用性。感謝各位能夠看到最后,如有問題,歡迎各位大佬在評論區指正,希望大家可以有所收獲!創作不易,希望大家多多支持!

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

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

相關文章

詳解 Java 中的 CopyOnWriteArrayList

目錄 【1】CopyOnWriteArrayList 簡介 【2】核心原理 1.底層數據結構 2.寫時復制機制 【3】CopyOnWriteArrayList常用方法及實例 1.添加元素方法 add () 2.獲取元素方法 get () 3.刪除元素方法remove() 【4】優缺點分析 【5】適用場景 【6】總結 【1】CopyOnWriteAr…

新手SEO優化快速起步教程

本教程專為SEO新手設計,幫助您快速上手優化工作。我們將一步步帶您了解基礎概念,包括高效挖掘關鍵詞的方法、內容優化的核心技巧,以及網站基礎設置的關鍵步驟。后續還會講解提升排名的實用策略、如何監控效果并進行調整,確保您能系…

Minecraft圖片搜索技巧

以下是更多專注 Minecraft 內容的高質量社區平臺,涵蓋建筑展示、模組/材質分享、實機截圖、藝術創作等方向,按類型分類整理:---一、國際知名綜合社區平臺 特點 鏈接 CurseForge 模組/材質/數據包第一倉庫,作者更新快,支…

數學建模-非線性規劃(NLP)

1-理論知識介紹應用2-基于matlab實現非線性規劃1)例1% 清除工作臺和命令行 clear;clc; x0[0 0 0]; A [-1 1 -1]; b 0; [x,value] fmincon(f1,x0,A,b,[],[],[],[],nonlfun1) function f f1(x)f x(1)^2x(2)^2x(3)^28; end function [c,ceq] nonlfun1(x)c [x(1)…

人工智能學習:什么是seq2seq模型

一、seq2seq模型 Seq2Seq(Sequence-to-Sequence)模型是一種用于處理序列轉換問題的深度學習模型,廣泛應用于機器翻譯、文本摘要、對話系統、語音識別等領域。Seq2Seq模型的核心思想是通過一個編碼器(Encoder)將輸入序列編碼為一個固定長度的上下文向量(Context Vector),…

生態 | 華院計算與深至科技達成戰略合作,攜手推動AI+醫學影像算法升級迭代

8月25日,華院計算技術(上海)股份有限公司(以下簡稱“華院計算”)與上海深至信息科技有限公司(以下簡稱“深至科技”)正式簽署戰略合作協議。雙方將秉持“優勢互補、資源共享、戰略協同、共同發展…

詳解MySQL環境變量配置及其在備份中的應用

正確配置MySQL環境變量是保障數據庫穩定運行和高效管理的基礎。這些變量涵蓋了從內存分配、連接設置到日志行為等方方面面,直接決定了數據庫的性能表現和功能特性。對于數據庫管理員而言,熟練掌握環境變量的配置,是進行性能調優和故障排查的必…

scikit-learn零基礎配置(含python、anaconda)

一、Anaconda環境搭建 1、關于Anaconda Anaconda 是一個非常 popular 的 Python 發行版,它不僅包含了 Python 語言本身,還預裝了眾多常用的科學計算庫,如 NumPy、Pandas、Matplotlib 等,能夠極大地方便用戶的開發和數據分析工作。…

RAG提示詞(日本語版)

RAG提示詞(日本語版) System Message # 知能型質問応答アシスタント(RAGシステムプロンプト)## 役割定義 あなたは「知能型質問応答アシスタント」として、提供されたコンテキスト情報に基づいてユーザーの質問に回答する専門的な…

qData 數據中臺【開源版】發布 1.0.5 版本,全面提升規則治理、非結構化數據處理與部署體驗

2025年9月3日 —— 企業級開源數據中臺 qData 開源版 正式發布 1.0.5 版本。本次更新聚焦 規則治理一體化、非結構化數據支持、以及開源版的體驗與部署優化,進一步提升規則復用能力、數據接入廣度與運維效率,幫助企業和開發者更輕松地構建高質量數據治理…

RecSys:用戶行為序列建模以及DIN、SIM模型

引言 在推薦系統中,用戶歷史行為序列是極其重要的信息源。用戶最近的點擊、點贊、收藏、轉發等行為能夠有效反映其即時興趣,無論是在召回、粗排還是精排階段,合理利用這些行為序列都能顯著提升推薦效果。本文將系統介紹用戶行為序列建模的幾…

QGIS二次開發01:環境配置-OSGeo4W鏡像

寫在前面: 本筆記根據多方資料整理而成,旨在為QGIS二次開發提供學習參考。內容僅供交流學習,歡迎共同探討。 一、關于QGIS QGIS 是一個功能強大的桌面GIS軟件本身,為用戶提供了圖形化界面(GUI)來進行地圖制…

對接旅游行業安全需求:旅游安全急救實訓室的功能構建與育人目標

隨著我國旅游行業的快速發展,游客安全需求日益凸顯,安全應急處置能力已成為旅游服務人才的核心競爭力。旅游安全急救實訓室作為旅游服務與管理專業中的重要教學場所,其功能構建與育人目標影響人才培養質量與行業安全水平。點擊獲取方案 一、行…

Typora處理markdown文件【給.md文檔加水印】

①文件→偏好設置→外觀→打開主題文件夾②在打開的文件夾中放入水印圖像③右鍵點擊github.css文件后,點擊編輯,進入編輯頁面④將代碼塊中內容粘貼到文件最后 更多效果請自行探索 #write::before {content: "CSDN果子當夜宵:bigxie.blog…

基于單片機的六足機器人控制系統設計

基于單片機的六足機器人控制系統設計摘 要本設計主要是基于單片機的六足機器人控制系統設計,綜合分析六足機器人的結構、步態和控制算法,結合云端服務器、WIFI 技術、藍牙技術、語音識別技術和手勢識別技術進行多種控制模式的設計,并提出不同…

RK3568 Trust

文章目錄1、環境介紹2、前言3、ARM TrustZone3.1、什么是ARM TrustZone3.2、cpu特權等級3.3、ARM Trusted Firmware4、Rockchip 平臺的 Trust4.1、實現機制4.2、啟動流程4.3、生命周期4.4、Trust 編譯打包流程分析5、總結1、環境介紹 硬件:飛凌ok3568-c開發板 軟件…

C語言數據結構——詳細講解《二叉樹與堆的基本概念》

C語言數據結構——詳細講解《二叉樹與堆的基本概念》前言一、樹的基礎概念1.1 為什么需要樹?1.2 樹的定義與結構1.3 樹的核心術語1.3 樹的核心術語1.4 樹的表示方法(孩子兄弟表示法)結構定義為什么用孩子兄弟表示法?1.5 樹的實際應…

STAR-CCM+|雷諾數回顧

【1】引言 前序已經學習了K-epsilon湍流模型溯源的基礎知識,今天再學習一些更為基礎的知識,回顧一下雷諾數ReReRe。 【2】雷諾數定義 雷諾數公式為: ReρvDμRe\frac{\rho vD}{\mu}ReμρvD? 式中, ρ\rhoρ——流體密度&…

Java中的死鎖

鎖的合理使用能夠保證共享數據的安全性,但是 使用不當也會可能引起死鎖。1. 死鎖概念 死鎖是指兩個或兩個以上的線程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力干涉那它們都將無法推進下去,如果系統資源充足,進程的資源請求…

基于STM32F103C8T6的智能家居健康環境監測系統

項目開發背景 隨著城市化進程加速和居民生活水平提升,人們對家居環境健康與安全的需求日益增強。現代住宅常因裝修材料、密閉空間及外部污染導致甲醛超標、PM2.5濃度升高、溫濕度失衡等問題,長期暴露此類環境中易引發呼吸道疾病、過敏反應等健康隱患。傳…