設計模式筆記(1)簡單工廠模式

最近在看程杰的《大話設計模式》,在這里做一點筆記。

書中主要有兩個角色:
小菜:初學者,學生;
大鳥:小菜表哥,大佬。
也按圖中的對話形式

01 簡單工廠模式

要求:使用c++、Java、C#或VB.NET任意一種面向對象語言實現一個計算器控制臺程序,要求輸入兩個數和運算符號,得到結果。
小菜的代碼:
小菜的代碼
大鳥指出部分問題:

  1. A, B, C, D 這樣的命名不規范;
  2. if的判斷分支,邏輯有誤,且未考慮除數輸入為0/輸入為字符非數字等等。

小菜對代碼進行修改:
修改后的代碼

修改后的邏輯基本沒有問題了,但是并沒有面向對象。
如何設計出容易維護,容易擴展,又容易復用的計算器程序呢?
程序要避免重復。
小菜:那就是分類,將計算和顯示分開?
大鳥:準確說,是讓業務邏輯與界面邏輯分開,讓它們之間的耦合度下降。只有分離開,才可以達到容易維護或擴展。

接下來,小菜重新進行了嘗試:
運算類:
運算類
main函數:

static void Main(string[] args)
{try{Console.Write("請輸入數字A:");string strNumberA = Console.ReadLine();Console.Write("請選擇運算符號(+、-、*、/):");string strOperate = Console.ReadLine();Console.Write("請輸入數字B:");string strNumberB = Console.ReadLine();string strResult = "";strResult = Convert.ToString(Operation.GetResult(Convert.ToDouble(strNumberA),Convert.ToDouble(strNumberB), strOperate));Console.WriteLine("結果是:" + strResult);Console.ReadLine();}catch (Exception ex){Console.WriteLine("您的輸入有錯:" + ex.Message);}
}??

目前,無論在windows,還是在web,手機端都可以在需要運算時使用上面運算類的定義。
這里使用到的是“面向對象”的封裝。

提問:如何更靈活的修改和擴展代碼呢?比如,現在希望增加一個開根號(sqrt)的運算。
小菜:直接修改Operation類?
大鳥:但問題是,要加一個平方根運算,卻需要讓加減乘除的運算都得來參與編譯。而且還可能讓原有的運行良好的功能代碼產生了變化,這個風險太大了

因此,需要盡量把加減乘除等運算分離,修改其中一個不影響其他
小菜進行新嘗試:

operation運算類:

public class Operation
{private double _numberA = 0;private double _numberB = 0;public double NumberA{get  {  return _numberA;  }set  {  _numberA = value;  }}public double NumberB{get  {  return _numberB;  }set  {  _numberB = value;  }}public virtual double GetResult(){double result = 0;return result;}
}??

兩個Number屬性,主要用于計算器的前后數,然后有一個虛方法GetResult(),用于得到結果。

加減乘法類:
加減乘法類
加減乘除都寫成了運算類的子類,繼承它后,重寫了GetResult()方法,這樣如果要修改任何一個算法,就不需要提供其他算法的代碼了。
但是,如何讓計算器知道我是希望用哪一個算法呢?

考慮用一個單獨的類來做這個創造實例的過程,這就是“工廠”

進行如下設置:
實例化

此時,只需要輸入運算符號,工廠就實例化出合適的對象。

一個實例:

Operation oper;
oper = OperationFactory.createOperate(“+”);
oper.NumberA = 1;
oper.NumberB = 2;
double result = oper.GetResult();??

此時,例如要修改加法運算,改OperationAdd即可。
如果需要增加各種復雜運算,增加相應的運算子類,并在switch中增加分支。

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

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

相關文章

Vue3 學習教程,從入門到精通,Vue 3 聲明式渲染語法指南(10)

Vue 3 聲明式渲染語法指南 本文將詳細介紹 Vue 3 中的聲明式渲染語法,涵蓋所有核心概念,并通過一個完整的案例代碼進行演示。案例代碼中包含詳細注釋,幫助初學者更好地理解每個部分的功能和用法。 目錄 簡介聲明式渲染基礎 文本插值屬性綁…

React hooks——useReducer

一、簡介useReducer 是 React 提供的一個高級 Hook,用于管理復雜的狀態邏輯。它類似于 Redux 中的 reducer 模式,適合處理包含多個子值、依賴前一個狀態或邏輯復雜的狀態更新場景。與 useState 相比,useReducer 提供更結構化的狀態管理方式。…

SEO中關于關鍵詞分類與布局的方法有那些

前邊我們說到關鍵詞挖掘肯定很重要,但如何把挖掘出來的關鍵詞用好更為重要,下邊我們就來說說很多seo剛入行的朋友比較頭疼的關鍵詞分類問題,為了更直觀的感受搭配了表格,希望可以給大家一些幫助!SEO優化之關鍵詞分類?挖掘出的關鍵…

考研最高效的準備工作是什么

從性價比的角度來說,考研最高效的準備工作是什么呢? 其實就是“卷成績”。 卷學校中各門課程的成績,卷考研必考的數學、英語、政治和專業課的成績。 因為現階段的考研,最看重的仍然是你的成績,特別是初試成績。 有了…

【Linux】基于Ollama和Streamlit快速部署聊天大模型

1.環境準備 1.1 安裝Streamlit 在安裝Streamlit之前,請確保您的系統中已經正確安裝了Python和pip。您可以在終端或命令行中運行以下命令來驗證它們是否已安裝 python --version pip --version一旦您已經準備好環境,現在可以使用pip來安裝Streamlit了。…

Jetpack - ViewModel、LiveData、DataBinding(數據綁定、雙向數據綁定)

一、ViewModel 1、基本介紹 ViewModel 屬于 Android Jetpack 架構組件的一部分,ViewModel 被設計用來存儲和管理與 UI 相關的數據,這些數據在配置更改(例如,屏幕旋轉)時能夠幸存下來,ViewModel 的生命周期與…

Go并發聊天室:從零構建實戰

大家好,今天我將分享一個使用Go語言從零開始構建的控制臺并發聊天室項目。這個項目雖然簡單,但它麻雀雖小五臟俱全,非常適合用來學習和實踐Go語言強大的并發特性,尤其是 goroutine 和 channel 的使用。 一、項目亮點與功能特性 …

瘋狂星期四第13天運營日報

網站運營第13天,點擊觀站: 瘋狂星期四 crazy-thursday.com 全網最全的瘋狂星期四文案網站 運營報告 昨日訪問量 昨天大概60個ip, 同比上個星期是高點的,但是與星期四差別還是太大了。😂 昨日搜索引擎收錄情況 百度依舊0收錄 …

吳恩達《AI for everyone》第二周課程筆記

機器學習項目工作流程以Echo/Alexa(語音識別AI)作為例子解釋: 1. collect data 收集數據——人為找很多人說 Alexa,并錄制音頻;并且還會讓一群人說其他詞語,比如hello 2. train model 訓練模型——用機器學…

uniapp props、$ref、$emit、$parent、$child、$on

1. uniapp props、ref、ref、ref、emit、parent、parent、parent、child、$on 1.1. 父組件和子組件 propsPage.vue導入props-son-view.vue組件的時候,我們就稱index.vue為父組件依次類推,在vue中只要能獲取到組件的實例,那么就可以調用組件的屬性或是方法進行操作 1.2. pr…

4、ubuntu | dify創建知識庫 | 上市公司個股研報知識庫

1、創建知識庫步驟 創建一個知識庫并上傳相關文檔主要涉及以下五個關鍵步驟: 創建知識庫:首先,需要創建一個新的知識庫。這可以通過上傳本地文件、從在線資源導入數據或者直接創建一個空的知識庫來實現。 指定分段模式:接下來是…

Kubernetes中為Elasticsearch配置多節點共享存儲

在Kubernetes中為Elasticsearch配置多節點共享存儲(ReadWriteMany)需結合存儲后端特性及Elasticsearch架構設計。 由于Elasticsearch默認要求每個節點獨立存儲數據(ReadWriteOnce),直接實現多節點共享存儲需特殊處理。 ??方案一:使用支持ReadWriteMany的存儲后端(推薦…

SpringBoot熱部署與配置技巧

配置文件SpringBoot 的熱部署Spring為開發者提供了一個名為spring-boot-devtools的模塊來使SpringBoot應用支持熱部署&#xff0c;提高開發者的開發效率&#xff0c;無需手動重啟SpringBoot應用相關依賴&#xff1a;<dependency> <groupId>org.springframework.boo…

Python與C#的三元運算符的寫法區別

一、語法結構對比??PyTorch示例??dev torch.device("cuda:0" if torch.cuda.is_available() else "cpu")??邏輯??&#xff1a;若torch.cuda.is_available()為真&#xff0c;則返回"cuda:0"&#xff0c;否則返回"cpu"。??作…

java 學習篇一

java知識點 一、windows不區分大小寫&#xff0c;linux區分大小寫 二、寫java需要JDK&#xff0c;一般運行環境需要JRE 三、JDK安裝一般是傻瓜是安裝 四、java主要工具javac、java&#xff1b;其中javac用于編譯.java -> .class&#xff1b;java用于執行.class文件執行時候不…

仙盟數據庫應用-外貿標簽打印系統 前端數據庫-V8--畢業論文-—-—仙盟創夢IDE

基于 Excel 標簽打印軟件的外貿打印流程優化與實踐摘要&#xff1a;在全球化外貿業務中&#xff0c;標簽打印是貨物流通、信息標識的關鍵環節。本文聚焦 “未來之窗云上打印技術” 的 Excel 標簽打印軟件&#xff0c;結合外貿平臺實際場景&#xff0c;分析其在打印流程中的應用…

【Linux】權限詳解 權限本質、權限屬性、su、sudo提權、chmod\chown\chgrp、文件類別

文章目錄一、權限的認識二、linux的權限本質三、linux的用戶su指令sudo提權四、linux角色五、文件權限屬性六、修改權限的指令操作chmod指令(權限只會驗證一次)chown/chgrp指令修改文件權限的八進制方案七、文件類別詳解一、權限的認識 什么是權限&#xff1f; 生活中處處都有權…

rman清理歸檔

1進入rman rman target / 2&#xff1a;列出所有歸檔日志的路徑 LIST ARCHIVELOG ALL; 3.然后在執行 crosscheck archivelog all;&#xff08;檢查 RMAN 存儲庫中記錄的歸檔日志是否在磁盤或備份存儲中實際存在。 4.然后在執行 delete noprompt expired archivelog all;&…

Selenium 處理動態網頁與等待機制詳解

在使用 Selenium 進行網頁自動化操作時&#xff0c;動態網頁往往是開發者遇到的第一個 “攔路虎”。想象一下&#xff1a;你明明在代碼中寫好了元素定位邏輯&#xff0c;運行時卻頻繁報錯 “元素不存在”&#xff0c;但手動打開網頁時元素明明就在眼前 —— 這很可能是因為網頁…

Salesforce 與外部系統實時集成:基于事件驅動的異步集成架構

在 Salesforce 與外部系統&#xff08;如 ERP、財務系統、物流系統等&#xff09;的實時集成中&#xff0c;“穩定性” 是核心挑戰 —— 既要保證數據同步的及時性&#xff0c;又要應對網絡波動、系統故障、并發沖突等不可控因素。以下從問題本質、技術瓶頸、解決方案細節三個維…