什么是工厂模式?
工厂模式是一种创建型设计模式,通过封装对象创建逻辑,解耦调用者与具体实现类的依赖关系。Go工厂模式具体可以细分为简单工厂模式、工厂方法模式和抽象工厂模式。
(一)简单工厂模式
简单工厂模式是最常用且实现简洁的模式,通过提供统一入口函数来创建不同对象实例。
定义一个Decoder接口,并定义Decode解码方法,代码示例:
// Decoder 定义解码器接口
type Decoder interface {Decode(v any) string
}
定义json和xml两个解码器,分别实现Decoder接口,代码示例:
/ JsonDecoder 定义json解码器结构体
type JsonDecoder struct {// 解码器类型DecodeType string
}// Decode json解码器实现Decder接口
func (j *JsonDecoder) Decode(v any) string {return fmt.Sprintf("我是%s解码器, 解析:%v", j.DecodeType, v)
}// XmlDecoder 定义xml解码器结构体
type XmlDecoder struct {// 解码器类型DecodeType string
}// Decode json解码器实现Decder接口
func (x *XmlDecoder) Decode(v any) string {return fmt.Sprintf("我是%s解码器, 解析:%v", x.DecodeType, v)
}
定义一个创建解码器的工厂方法,代码示例:
// NewDecoder 创建新的解码器
func NewDecoder(decodeType string) Decoder {switch decodeType {case "json":return &JsonDecoder{DecodeType: decodeType}case "xml":return &XmlDecoder{DecodeType: decodeType}default:return nil}
}
调用实例如下:
func main() {decoder := NewDecoder("json")if decoder == nil {fmt.Println("未找到对应解码器")} else {decodeStr := decoder.Decode("test")fmt.Printf("解码后:%s", decodeStr)}
}
(二)工厂方法模式
工厂方法模式通过定义创建对象实例接口实现,支持更灵活的扩展,让子类自己决定实例化哪个类。
定义一个DecoderFactory解码器工厂接口,代码示例:
// DecoderFactory 定义解码器工厂接口
type DecoderFactory interface {NewDecoder() Decoder
}
定义json和xml两个解码器工厂,分别实现DecoderFactory接口,代码示例:
// JsonDecoderFactory 定义json解码器工厂
type JsonDecoderFactory struct{}// NewDecoder 创建解码器
func (j *JsonDecoderFactory) NewDecoder() Decoder {return &JsonDecoder{DecodeType: "json"}
}// XmlDecoderFactory 定义xml解码器工厂
type XmlDecoderFactory struct{}// NewDecoder 创建解码器
func (x *XmlDecoderFactory) NewDecoder() Decoder {return &XmlDecoder{DecodeType: "json"}
}
调用实例如下:
func main() {decoderFactory := &JsonDecoderFactory{}decoder := decoderFactory.NewDecoder()decodeStr := decoder.Decode("test")fmt.Printf("解码后:%s", decodeStr)
}
(三)抽象工厂模式
抽象工厂模式提供一个创建一组相关或相互依赖对象的接口,无需指定具体的类。
定义一个DecoderFactoryCreateInterface接口,并定义Decode解码方法,代码示例:
// DecoderFactoryCreateInterface 定义解码器工厂创建工厂接口
type DecoderFactoryCreateInterface interface {// NewDecoder 创建解码器NewDecoder() Decoder
}
定义JsonDecoderCreateFactory和XmlDecoderCreateFactory两个解码器创建工厂,实现DecoderFactoryCreateInterface接口,代码示例:
// JsonDecoderCreateFactory JSON解码器创建工厂
type JsonDecoderCreateFactory struct {
}func (j *JsonDecoderCreateFactory) NewDecoder() Decoder {return &JsonDecoder{DecodeType: "json"}
}// XmlDecoderCreateFactory XML解码器创建工厂
type XmlDecoderCreateFactory struct {
}func (x *XmlDecoderCreateFactory) NewDecoder() Decoder {return &XmlDecoder{DecodeType: "json"}
}
定义一个获取解码器创建工厂的getDecoderFactory方法,示例代码:
// 获取解码器创建工厂
func getDecoderFactory(decodeType string) DecoderFactory {switch decodeType {case "json":return &JsonDecoderCreateFactory{}case "xml":return &XmlDecoderCreateFactory{}default:return nil}
}
通过getDecoderFactory方法获取需要的解码器工厂,通过创建的解码器工厂创建调用示例如下:
func main() {decoderCreateFactory := getDecoderFactory("json")if decoderCreateFactory == nil {fmt.Println("没有找到对应解码器工厂")return}decoder := decoderFactory.NewDecoder()decodeStr := decoder.Decode("test")fmt.Printf("解码后:%s", decodeStr)
}
三种工厂模式对比
■ 简单工厂模式
- 优点:调用者只要知道需要创建解码器的类型,不需要知道具体的类;
- 缺点:扩展困难,需要增加新类时需要修改工厂逻辑,当业务类较多时,会提高工厂类复杂度不利于系统的扩展和维护。
■ 工厂方法模式
- 优点:1)具有良好的扩展性,如果需要增加一个新的解码器,只需要创建一个新的工厂类;2)调用者只需要调用对应工厂名称就一个创建对象实例。
- 缺点:每次增加一个新类型解码器,都需要新增一个工厂类。
■ 抽象工厂模式
- 优点:抽象工厂模式封装了创建对象实例的方法,可以将调用者和具体实现分开。对象具体类名和具体工厂分离,不会出现在调用者代码中。
- 缺点:当需要扩展新的特性方法时,需要扩展工厂接口,这是需要修改所有抽象工厂对象以及所有实现子对象。
关注公众号:无脑编程