【設計模式】使用 go 語言實現簡單工廠模式

来源:https://www.cnblogs.com/codecodify/archive/2023/05/15/17403137.html
-Advertisement-
Play Games

元語言抽象就是建立新的語言。它在工程設計的所有分支中都扮演著重要的角色,在電腦程式設計領域更是特別重要。因為這個領域中,我們不僅可以設計新的語言,還可以通過構造求值器的方式實現這些語言。對某個程式設計語言的求值器(或者解釋器)也是一個過程,在應用於這個語言的一個表達式時,它能夠執行求值這個表達式所... ...


最近在看《大話設計模式》,這本書通過對話形式講解設計模式的使用場景,有興趣的可以去看一下。

第一篇講的是簡單工廠模式,要求輸入兩個數和運算符號,得到運行結果。

這個需求不難,難就難在類要怎麼設計,才能達到可復用、維護性強、可拓展和靈活性高。

運算符可能是加、減、乘、除,未了方便以後可以拓展其它運算符,這裡可以聲明一個抽象介面,通過簡單工廠設計模式返回不通的運算類。

package operate

type IOperate interface {
	GetResult(a int, b int) int
}

首先聲明一個IOperate抽象介面表示運算,然後新建AddSubMulDiv結構體實現這個運行介面:

package operate


type Add struct{}

func (o Add) GetResult(a int, b int) int {
	return a + b
}


type Sub struct{}

func (o Sub) GetResult(a int, b int) int {
	return a - b
}


type Mul struct{}

func (o Mul) GetResult(a int, b int) int {
	return a * b
}


type Div struct{}

func (o Div) GetResult(a int, b int) int {
	if b == 0 {
		panic("除數不能為0")
	}
	return a / b
}


然後定義一個工廠,參數為運算符號:

package main

// NewOperate 按照操作符號創建操作對象
func NewOperate(o string) operate.IOperate {
	switch o {
	case "+":
		return operate.Add{}
	case "-":
		return operate.Sub{}
	case "*":
		return operate.Mul{}
	case "/":
		return operate.Div{}
	default:
		panic("操作符號錯誤")
	}
}

最後運行:

package main

import "fmt"

func main() {
	var a, b int
	fmt.Println("請輸入兩個數:")
	fmt.Scanf("%d %d", &a, &b)
	fmt.Println("請輸入運算符號(+、-、*、/):")
	var operate string
	fmt.Scanf("%s", &operate)
	operateObj := NewOperate(operate)
	result := operateObj.GetResult(a, b)
	fmt.Printf("%d %s %d = %d\n", a, operate, b, result)
}



要增加不同的運算操作只需要新增實現了抽象運算介面的結構體和修改工廠,因為go語言的函數也是一種類型,其實上面的代碼可以簡化,不用每次都新增一個結構體:

type OperateFun func(a, b int) int

// GetOperateFunc 按照操作符號創建操作函數,函數式編程
func GetOperateFunc(o string) OperateFun {
	switch o {
	case "+":
		return func(a, b int) int {
			return a + b
		}
	case "-":
		return func(a, b int) int {
			return a - b
		}
	case "*":
		return func(a, b int) int {
			return a * b
		}
	case "/":
		return func(a, b int) int {
			if b == 0 {
				panic("除數不能為0")
			}
			return a / b
		}
	default:
		panic("操作符號錯誤")
	}

main函數可以這樣調用:

var a, b int
fmt.Println("請輸入兩個數:")
fmt.Scanf("%d %d", &a, &b)
fmt.Println("請輸入運算符號(+、-、*、/):")
var operate string
fmt.Scanf("%s", &operate)
operateFun := GetOperateFunc(operate)
result = operateFun(a, b)
fmt.Printf("%d %s %d = %d\n", a, operate, b, result)

寫業務代碼還是要多想一下用什麼設計模式合適,避免編寫的代碼後面不好維護和擴展,這需要多練習。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在探究 Kafka 核心知識之前,我們先思考一個問題:什麼場景會促使我們使用 Kafka? 說到這裡,我們頭腦中或多或少會蹦出非同步解耦和削峰填谷等字樣,是的,這就是 Kafka 最重要的落地場景。 ...
  • 普通構造函數VS初始化列表構造函數 初始化列表構造函數最優先匹配問題 對於一個類而言,只要其中包含有初始化列表的構造函數,編譯器在編譯使用{}語法的構造時會最傾向於調用初始化列表構造函數,哪怕做類型轉換也在所不惜,哪怕有類型最佳匹配的普通構造函數或移動構造函數也會被劫持 class Widget { ...
  • 在Django REST framework的SimpleJWT庫中,AccessToken是一個類,用於表示一個JSON Web Token (JWT)中的訪問令牌部分。訪問令牌是一種常見的身份驗證令牌,通常用於保護API端點。 通過SimpleJWT庫,您可以使用AccessToken類創建、解 ...
  • 1.下載maven 方式一: 官網下載所需要的版本,官網地址:https://maven.apache.org/ 方式二: 百度網盤鏈接下載3.6.1版,鏈接:鏈接:https://pan.baidu.com/s/16IuluK4oo3K8kMG9B_SV3Q?pwd=35un 提取碼:35un 下 ...
  • 教程簡介 Java併發入門教程 - 從簡單的步驟瞭解Java併發,從基本到高級概念,包括概述,環境設置,主要操作,線程通信,同步,死鎖,ThreadLocal,ThreadLocalRandom,Lock,ReadWriteLock,Condition,AtomicInteger, AtomicLo ...
  • TokenObtainPairSerializer和TokenObtainPairView是Django REST framework的SimpleJWT庫提供的兩個相關的類。 TokenObtainPairSerializer是一個用於序列化和驗證用戶憑證以生成JSON Web Token(JWT ...
  • 我們在使用mq的時候,就會很自然思考一個問題:怎麼保證數據不丟失? 現在austin接入層是把消息發到mq,下發邏輯層從mq消費數據,隨後調用對應渠道介面來下發消息。 消息推送平臺🔥推送下發【郵件】【簡訊】【微信服務號】【微信小程式】【企業微信】【釘釘】等消息類型。 https://gitee.c ...
  • 教程簡介 IDEA 全稱 IntelliJ IDEA,是java編程語言的集成開發環境。IntelliJ在業界被公認為最好的Java開發工具,尤其在智能代碼助手、代碼自動提示、重構、JavaEE支持、各類版本工具(git、svn等)、JUnit、CVS整合、代碼分析、 創新的GUI設計等方面的功能可 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...