马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
Golang学习条记_26——通道
Golang学习条记_27——单例模式
Golang学习条记_28——工厂方法模式
工厂方法模式(实例)
- 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()
- }
复制代码 测试方法
- 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
复制代码 |