Golang学习笔记_28——工厂方法模式(实例)

ops/2025/1/22 23:48:09/

Golang学习笔记_26——通道
Golang学习笔记_27——单例模式
Golang学习笔记_28——工厂方法模式


工厂方法模式(实例)

package factory_method_demoimport "fmt"// Order 接口,定义订单的基本操作
type Order interface {CalculateTotal() float64Display()
}// RegularOrder 是普通订单结构体
type RegularOrder struct {Items  []stringPrices []float64
}// CalculateTotal 计算普通订单的总价
func (o *RegularOrder) CalculateTotal() float64 {var total float64for _, price := range o.Prices {total += price}return total
}// Display 显示普通订单信息
func (o *RegularOrder) Display() {fmt.Println("Regular Order:")for i, item := range o.Items {fmt.Printf("Item %d: %s, Price: %.2f\n", i+1, item, o.Prices[i])}fmt.Printf("Total Price: %.2f\n", o.CalculateTotal())
}// PromotionOrder 是促销订单结构体
type PromotionOrder struct {Items    []stringPrices   []float64Discount float64
}// CalculateTotal 计算促销订单的总价
func (o *PromotionOrder) CalculateTotal() float64 {var total float64for _, price := range o.Prices {total += price}return total * (1 - o.Discount)
}// Display 显示促销订单信息
func (o *PromotionOrder) Display() {fmt.Println("Promotion Order:")for i, item := range o.Items {fmt.Printf("Item %d: %s, Price: %.2f\n", i+1, item, o.Prices[i])}fmt.Printf("Total Price (after discount): %.2f\n", o.CalculateTotal())
}// OrderCreator 是订单创建者接口,包含工厂方法 CreateOrder
type OrderCreator interface {CreateOrder(items []string, prices []float64, discount ...float64) Order
}// RegularOrderCreator 是普通订单创建者结构体
type RegularOrderCreator struct{}// CreateOrder 创建普通订单
func (roc *RegularOrderCreator) CreateOrder(items []string, prices []float64, discount ...float64) Order {return &RegularOrder{Items:  items,Prices: prices,}
}// PromotionOrderCreator 是促销订单创建者结构体
type PromotionOrderCreator struct{}// CreateOrder 创建促销订单,支持折扣参数
func (poc *PromotionOrderCreator) CreateOrder(items []string, prices []float64, discount ...float64) Order {var disc float64if len(discount) > 0 {disc = discount[0]} else {disc = 0}return &PromotionOrder{Items:    items,Prices:   prices,Discount: disc,}
}func test2() {// 创建普通订单regularCreator := &RegularOrderCreator{}regularOrder := regularCreator.CreateOrder([]string{"Item1", "Item2"}, []float64{100.0, 200.0})regularOrder.Display()// 创建促销订单promotionCreator := &PromotionOrderCreator{}promotionOrder := promotionCreator.CreateOrder([]string{"Item3", "Item4"}, []float64{150.0, 250.0}, 0.1)promotionOrder.Display()
}

测试方法

func Test_test2(t *testing.T) {test2()
}

输出结果

=== RUN   Test_test2
Regular Order:
Item 1: Item1, Price: 100.00
Item 2: Item2, Price: 200.00
Total Price: 300.00
Promotion Order:
Item 1: Item3, Price: 150.00
Item 2: Item4, Price: 250.00
Total Price (after discount): 360.00
--- PASS: Test_test2 (0.00s)
PASS

http://www.ppmy.cn/ops/152309.html

相关文章

【24】Word:小郑-准考证❗

目录 题目 准考证.docx 邮件合并-指定考生生成准考证 Word.docx 表格内容居中表格整体相较于页面居中 考试时一定要做一问保存一问❗ 题目 准考证.docx 插入→表格→将文本转换成表格→✔制表符→确定选中第一列→单击右键→在第一列的右侧插入列→布局→合并单元格&#…

T-SQL语言的数据库编程

T-SQL语言的数据库编程 1. 引言 在信息化迅速发展的今天,数据库已经成为数据管理和使用的重要工具。其中,T-SQL(Transact-SQL)作为微软SQL Server的扩展SQL语言,不仅用于数据查询和管理,还能够进行复杂的…

USB-OTG中的HNP和SRP协议与ID引脚的硬件支持关系详解

在USB On-The-Go(OTG)架构中,HNP(Host Negotiation Protocol,主机协商协议)和SRP(Session Request Protocol,会话请求协议)是实现设备动态切换主机与从设备角色的关键协议…

B3DM转换成STEP

3D模型在线转换是一个可以进行3D模型格式转换的在线工具,支持多种3D模型格式进行在线预览和互相转换。 B3DM格式与STEP格式简介 B3DM(Binary 3D Model)是一种用于存储三维模型的二进制格式,特别适用于大规模的三维城市建模和地理…

大模型GUI系列论文阅读 DAY3:《GPT-4V(ision) is a Generalist Web Agent, if Grounded》

摘要 近年来,大型多模态模型(LMMs)的发展,特别是 GPT-4V(ision) 和 Gemini,迅速扩展了多模态模型的能力边界,不再局限于传统任务如图像描述和视觉问答。在本研究中,我们探讨了 LMMs&#xff08…

01.01、判定字符是否唯一

01.01、[简单] 判定字符是否唯一 1、题目描述 实现一个算法,确定一个字符串 s 的所有字符是否全都不同。 在这一题中,我们的任务是判断一个字符串 s 中的所有字符是否全都不同。我们将讨论两种不同的方法来解决这个问题,并详细解释每种方法…

麒麟操作系统服务架构保姆级教程(十三)tomcat环境安装以及LNMT架构

如果你想拥有你从未拥有过的东西,那么你必须去做你从未做过的事情 之前咱们学习了LNMP架构,但是PHP对于技术来说确实是老掉牙了,PHP的市场占有量越来越少了,我认识一个10年的PHP开发工程师,十年工资从15k到今天的6k&am…

【STL】list 双向循环链表的使用介绍

STL中list容器的详细使用说明 一.list的文档介绍二. list的构造函数三.list中的访问与遍历操作四.list中的修改操作4.1 list中的各种修改操作4.2 list的迭代器失效问题 五.list中的其他一些操作 一.list的文档介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器…