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

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


工厂方法模式(实例)

go 复制代码
package factory_method_demo

import "fmt"

// Order 接口,定义订单的基本操作
type Order interface {
	CalculateTotal() float64
	Display()
}

// RegularOrder 是普通订单结构体
type RegularOrder struct {
	Items  []string
	Prices []float64
}

// CalculateTotal 计算普通订单的总价
func (o *RegularOrder) CalculateTotal() float64 {
	var total float64
	for _, 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    []string
	Prices   []float64
	Discount float64
}

// CalculateTotal 计算促销订单的总价
func (o *PromotionOrder) CalculateTotal() float64 {
	var total float64
	for _, 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 float64
	if 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()
}

测试方法

go 复制代码
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
相关推荐
YuCaiH2 分钟前
Linux文件处理
linux·笔记·嵌入式
早睡冠军候选人12 分钟前
Ansible学习----Ansible Playbook
运维·服务器·学习·云原生·容器·ansible
Cathy Bryant14 分钟前
大模型损失函数(二):KL散度(Kullback-Leibler divergence)
笔记·神经网络·机器学习·数学建模·transformer
楼田莉子19 分钟前
C++学习:C++11扩展:constexpr特性
开发语言·c++·学习
懒羊羊不懒@23 分钟前
Java基础语法—最小单位、及注释
java·c语言·开发语言·数据结构·学习·算法
qq_3985865436 分钟前
Threejs入门学习笔记
javascript·笔记·学习
hour_go1 小时前
TCP/IP协议相关知识点
网络·笔记·网络协议·tcp/ip
潘达斯奈基~2 小时前
在使用spark的applyInPandas方法过程中,遇到类型冲突问题如何解决
大数据·笔记
菜鸟‍2 小时前
【论文学习】大语言模型(LLM)论文
论文阅读·人工智能·学习
我先去打把游戏先3 小时前
ESP32学习笔记(基于IDF):IOT应用——WIFI连接
笔记·单片机·嵌入式硬件·mcu·物联网·学习·esp32