Go从入门到精通——包(package)——示例:工厂模式自动注册——管理多个包的结构体

示例:工厂模式自动注册——管理多个包的结构体

  本例利用包的 init 特性,将 cls1 和 cls2 两个包注册到工厂,使用字符串创建这两个注册好的结构实例。

代码1-1 类工厂(具体文件:../clsfactory/base/factory.go)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package base
 
//类接口
type Class interface {
    Do()
}
 
var (
    //保存注册好的工厂信息
    factoryByName = make(map[string]func() Class)
)
 
//注册一个类生成工厂
func Register(name string, factory func() Class) {
    factoryByName[name] = factory
}
 
//根据名称创建对应的类
func Create(name string) Class {
    if f, ok := factoryByName[name]; ok {
        return f()
    } else {
        panic("name not found!")
    }
}

  代码1-2 类1及注册代码(具体文件:../clsfactory/cls1/reg.go)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package cls1
 
import (
    "clsfactory/base"
    "fmt"
)
 
//定义类cls1
type Class1 struct {
}
 
//实现 class 接口
func (c *Class1) Do() {
    fmt.Println("Class1 class")
}
 
func init() {
 
    //在启动时注册 类1 工厂
    base.Register("Class1", func() base.Class { return new(Class) })
}  

代码1-3 类2及注册代码(具体文件:../clsfactory/cls2/reg.go) 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package cls2
 
import (
    "clsfactory/base"
    "fmt"
)
 
//定义类cls2
type Class2 struct {
}
 
//实现 Class 接口
func (c *Class2) Do(){
    fmt.Println("Class2 class")
}
 
func init(){
 
    //在启动时注册类2工厂
    base.Register("Class2",func() base.Class{ return new(Class2)})
}

  代码1-4 类工程主流程(具体文件:../clsfactory/cls2/reg.go)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main
 
import (
    "clsfactory/base"
    _ "clsfactory/cls1" //匿名引用 cls1 包,自动注册
    _ "clsfactory/cls2" //匿名引用 cls2 包,自动注册
)
 
func main() {
 
    //根据字符串动态创建一个 Class1 实例
    c1 := base.Create("Class1")
    c1.Do()
 
    //根据字符串动态创建一个 Class2 实例
    c2 := base.Create("Class2")
    c2.Do()
 
}

  代码运行结果如下:

posted @   左扬  阅读(186)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
levels of contents
点击右上角即可分享
微信分享提示