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

[复制链接]
发表于 2025-11-6 13:40:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

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

工厂方法模式(实例)

  1. package factory_method_demo
  2. import "fmt"
  3. // Order 接口,定义订单的基本操作
  4. type Order interface {
  5.         CalculateTotal() float64
  6.         Display()
  7. }
  8. // RegularOrder 是普通订单结构体
  9. type RegularOrder struct {
  10.         Items  []string
  11.         Prices []float64
  12. }
  13. // CalculateTotal 计算普通订单的总价
  14. func (o *RegularOrder) CalculateTotal() float64 {
  15.         var total float64
  16.         for _, price := range o.Prices {
  17.                 total += price
  18.         }
  19.         return total
  20. }
  21. // Display 显示普通订单信息
  22. func (o *RegularOrder) Display() {
  23.         fmt.Println("Regular Order:")
  24.         for i, item := range o.Items {
  25.                 fmt.Printf("Item %d: %s, Price: %.2f\n", i+1, item, o.Prices[i])
  26.         }
  27.         fmt.Printf("Total Price: %.2f\n", o.CalculateTotal())
  28. }
  29. // PromotionOrder 是促销订单结构体
  30. type PromotionOrder struct {
  31.         Items    []string
  32.         Prices   []float64
  33.         Discount float64
  34. }
  35. // CalculateTotal 计算促销订单的总价
  36. func (o *PromotionOrder) CalculateTotal() float64 {
  37.         var total float64
  38.         for _, price := range o.Prices {
  39.                 total += price
  40.         }
  41.         return total * (1 - o.Discount)
  42. }
  43. // Display 显示促销订单信息
  44. func (o *PromotionOrder) Display() {
  45.         fmt.Println("Promotion Order:")
  46.         for i, item := range o.Items {
  47.                 fmt.Printf("Item %d: %s, Price: %.2f\n", i+1, item, o.Prices[i])
  48.         }
  49.         fmt.Printf("Total Price (after discount): %.2f\n", o.CalculateTotal())
  50. }
  51. // OrderCreator 是订单创建者接口,包含工厂方法 CreateOrder
  52. type OrderCreator interface {
  53.         CreateOrder(items []string, prices []float64, discount ...float64) Order
  54. }
  55. // RegularOrderCreator 是普通订单创建者结构体
  56. type RegularOrderCreator struct{}
  57. // CreateOrder 创建普通订单
  58. func (roc *RegularOrderCreator) CreateOrder(items []string, prices []float64, discount ...float64) Order {
  59.         return &RegularOrder{
  60.                 Items:  items,
  61.                 Prices: prices,
  62.         }
  63. }
  64. // PromotionOrderCreator 是促销订单创建者结构体
  65. type PromotionOrderCreator struct{}
  66. // CreateOrder 创建促销订单,支持折扣参数
  67. func (poc *PromotionOrderCreator) CreateOrder(items []string, prices []float64, discount ...float64) Order {
  68.         var disc float64
  69.         if len(discount) > 0 {
  70.                 disc = discount[0]
  71.         } else {
  72.                 disc = 0
  73.         }
  74.         return &PromotionOrder{
  75.                 Items:    items,
  76.                 Prices:   prices,
  77.                 Discount: disc,
  78.         }
  79. }
  80. func test2() {
  81.         // 创建普通订单
  82.         regularCreator := &RegularOrderCreator{}
  83.         regularOrder := regularCreator.CreateOrder([]string{"Item1", "Item2"}, []float64{100.0, 200.0})
  84.         regularOrder.Display()
  85.         // 创建促销订单
  86.         promotionCreator := &PromotionOrderCreator{}
  87.         promotionOrder := promotionCreator.CreateOrder([]string{"Item3", "Item4"}, []float64{150.0, 250.0}, 0.1)
  88.         promotionOrder.Display()
  89. }
复制代码
测试方法
  1. func Test_test2(t *testing.T) {
  2.         test2()
  3. }
复制代码
输出效果
  1. === RUN   Test_test2
  2. Regular Order:
  3. Item 1: Item1, Price: 100.00
  4. Item 2: Item2, Price: 200.00
  5. Total Price: 300.00
  6. Promotion Order:
  7. Item 1: Item3, Price: 150.00
  8. Item 2: Item4, Price: 250.00
  9. Total Price (after discount): 360.00
  10. --- PASS: Test_test2 (0.00s)
  11. PASS
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表