这里提供一个示例,演示注册模块的调用逻辑。
package main
import "fmt"
// RegistrationContext 定义了注册构建组件的接口
type RegistrationContext interface {
RegisterModuleType(name string, factory ModuleFactory)
RegisterSingletonType(name string, factory SingletonFactory)
}
// ModuleFactory 是一个工厂函数,用于创建模块
// 这是定义一个函数类型的语法。在Go中,你可以为函数定义类型,以便在代码中更灵活地使用它们
// ModuleFactory 是一个函数类型。它表示任何返回 Module 类型的函数。
// 这样可以在代码中使用 ModuleFactory 类型来传递和调用工厂函数。
type ModuleFactory func() Module
// SingletonFactory 是一个工厂函数,用于创建单例
type SingletonFactory func() Singleton
// Module 代表一个模块
type Module interface {
GetName() string
}
// Singleton 代表一个单例
type Singleton interface {
GetName() string
}
// ConcreteModule 是一个具体的模块
type ConcreteModule struct {
Name string
}
func (m *ConcreteModule) GetName() string {
return m.Name
}
// NewConcreteModule 是 ConcreteModule 的工厂函数
func NewConcreteModule() Module {
return &ConcreteModule{Name: "ConcreteModule"}
}
// ConcreteSingleton 是一个具体的单例
type ConcreteSingleton struct {
Name string
}
func (s *ConcreteSingleton) GetName() string {
return s.Name
}
// NewConcreteSingleton 是 ConcreteSingleton 的工厂函数
func NewConcreteSingleton() Singleton {
return &ConcreteSingleton{Name: "ConcreteSingleton"}
}
// initRegistrationContext 实现了 RegistrationContext 接口
type initRegistrationContext struct {
moduleTypes map[string]ModuleFactory
singletonTypes map[string]SingletonFactory
}
// RegisterModuleType 注册模块类型
func (ctx *initRegistrationContext) RegisterModuleType(name string, factory ModuleFactory) {
ctx.moduleTypes[name] = factory
}
// RegisterSingletonType 注册单例类型
func (ctx *initRegistrationContext) RegisterSingletonType(name string, factory SingletonFactory) {
ctx.singletonTypes[name] = factory
}
// NewTestContext 创建一个新的测试上下文
func NewTestContext() *initRegistrationContext {
return &initRegistrationContext{
moduleTypes: make(map[string]ModuleFactory),
singletonTypes: make(map[string]SingletonFactory),
}
}
// RegisterBuildComponents 用于注册构建组件
func RegisterBuildComponents(ctx RegistrationContext) {
ctx.RegisterModuleType("concreteModule", NewConcreteModule)
ctx.RegisterSingletonType("concreteSingleton", NewConcreteSingleton)
}
func main() {
// 测试输出,展示注册结果
ctx := NewTestContext()
RegisterBuildComponents(ctx)
moduleType, ok := ctx.moduleTypes["concreteModule"]
if ok {
module := moduleType()
fmt.Printf("Registered module type: %s\n", module.GetName())
} else {
fmt.Println("No module type registered")
}
singletonType, ok := ctx.singletonTypes["concreteSingleton"]
if ok {
singleton := singletonType()
fmt.Printf("Registered singleton type: %s\n", singleton.GetName())
} else {
fmt.Println("No singleton type registered")
}
}
Registered module type: ConcreteModule
Registered singleton type: ConcreteSingleton