工厂模式是什么
工厂方法模式是一种创建型设计模式,其在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型。
案例:比如当前需要实现一个多云平台的文件上传,以适配不同场景下的文件上传功能。
不使用设计模式的情况。
这样有什么问题呢?
代码耦合度高、灵活度低。我们换一种存储方式,就需要改动所有的调用者。
使用工厂设计模式。
使用工厂模式可以通过封装一个独立的方法,根据不同的存储方式去调用不同的OSS方法。这样对于整个代码的改动性更低。
由于不同的云存储,可能存在不同的方法。为了方便调用方,更加方便、统一的去调用不同的存储方法,这里在底层封装一个interface,每一个云存储方法实现该interface。这样不管是什么存储平台,我们调用的方法都是一致。
示例代码
type IGun interface {
setName(name string)
setPower(power int)
getName() string
getPower() int
}
type Gun struct {
name string
power int
}
func (g *Gun) setName(name string) {
g.name = name
}
func (g *Gun) setPower(power int) {
g.power = power
}
func (g *Gun) getName() string {
return g.name
}
func (g *Gun) getPower() int {
return g.power
}
// Ak47 定义一个实体结构体(用来处理实际的任务)
type ak47 struct {
Gun
}
// newAk47Instance 定义一个函数,暴露出Musket实例
func newAk47Instance(name string, power int) IGun {
return &musket{
Gun{name: name, power: power},
}
}
// Musket 定义一个实体结构体(用来处理实际的任务)
type musket struct {
Gun
}
// newMusketInstance 定义一个函数,暴露出Musket实例
func newMusketInstance(name string, power int) IGun {
return &musket{
Gun{name: name, power: power},
}
}
func getStruct(structName string) (IGun, error) {
if structName == "ak47" {
return &ak47{}, nil
}
if structName == "musket" {
return &musket{}, nil
}
return nil, errors.New("参数传递错误")
}
func main() {
getAk()
fmt.Println("======================")
getMusket()
}
func getAk() {
akStruct, err := getStruct("ak47")
if err != nil {
fmt.Println("获取ak结构体失败", err)
return
}
akStruct.setName("我是ak47")
akStruct.setPower(1)
fmt.Printf("%s我的动力是%d\n", akStruct.getName(), akStruct.getPower())
}
func getMusket() {
akStruct, err := getStruct("musket")
if err != nil {
fmt.Println("获取ak结构体失败", err)
return
}
akStruct.setName("我是musket")
akStruct.setPower(2)
fmt.Printf("%s我的动力是%d\n", akStruct.getName(), akStruct.getPower())
}
我是ak47我的动力是1
======================
我是musket我的动力是2