将杂乱无章的类实例化过程封装成公共的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
}
评论区