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() } |
代码运行结果如下:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具