侧边栏壁纸
  • 累计撰写 38 篇文章
  • 累计创建 81 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

工厂(多个工厂)

小李同学
2024-02-26 / 0 评论 / 0 点赞 / 562 阅读 / 455 字 / 正在检测是否收录...

将杂乱无章的类实例化过程封装成公共的CreateProduct方法,通过传入的类型标识返回特定的类实例。实例化的过程中,可以根据业务约定事先设置好属性值。另外可以通过一个interface{}的Func作为CreateProduct的返回值,这样接口中所有的方法可以实现共用和统一管理。工厂模式相较于简单工厂主要在于实例化过程中使用了多个工厂函数

入口


// 定义公共接口
type ILOL interface {
	// QueryEquipments 查询所有装备列表
	QueryEquipments(ctx *context.Context) (interface{}, error)
}

// 定义构造类返回类型
type LOLProductFunc func() ILOL

// 第一个工厂函数
func CreateLOLProduct(platform int) LOLProductFunc {
	if platform == common.PlatformForLOL {
		return func() ILOL {
			return &LOL{
				platform:      common.PlatformForLOL,
				ts:            time.Now().Unix() / 600,
				referer:       header.Referer,
			}
		}
	} else {
		return func() ILOL {
			return &LOLM{
				platform:      common.PlatformForLOLM,
				ts:            time.Now().Unix() / 600,
				referer:       header.Referer,
			}
		}
	}
}

// 第二个工厂函数
func CreateLOLProduct2(platform int) LOLProductFunc {
		return func() ILOL {
			return &LOL{
				platform:      common.PlatformForLOL,
				ts:            time.Now().Unix() / 600,
				referer:       header.Referer,
			}
		}
}

lol.go

type LOL struct {
	platform      int
	ts            int64
	referer       []http.Header
}

func (lol *LOL) QueryEquipments(ctx *context.Context) (interface{}, error) {
	url := fmt.Sprintf("%s?ts=%d", config.LOLConfig.Lol.Equipment, lol.ts)

	// 发送 GetForm 请求
	equip := dto.LOLEquipment{}

	body, err := http.GetForm(ctx, url)
	if err != nil {
		return nil, err
	}

	err = json.Unmarshal(body, &equip)
	return &equip, err
}

lolm.go

type LOLM struct {
	platform      int
	ts            int64
	referer       []http.Header
}

func (lol *LOLM) QueryEquipments(ctx *context.Context) (interface{}, error) {
	url := fmt.Sprintf("%s?ts=%d", config.LOLConfig.LolM.Equipment, lol.ts)

	// 发送 GetForm 请求
	equip := dto.LOLMEquipment{}

	body, err := http.GetForm(ctx, url)
	if err != nil {
		return nil, err
	}

	err = json.Unmarshal(body, &equip)
	return &equip, err
}

调用

func QueryEquipments(ctx *context.Context, platform int) (any,any, error) {
	// 使用第一个工厂函数获取实例
	equipments, err := lol.CreateLOLProduct(platform)().QueryEquipments(ctx)
	if err != nil {
		return nil,nil, err
	}

	// 使用第二个工厂函数获取实例
    equipments2, err := lol.CreateLOLProduct2(platform)().QueryEquipments(ctx)
	if err != nil {
		return nil,nil, err
	}
    
	return equipments,equipments2, nil
}
0

评论区