函数选项模式
用于构建灵活且可扩展的功能配置
实现方式
- 定义一个选项类型:可以使用接口、函数类型或结构体来定义选项。
- 定义一个配置函数:对于每个选项,定义一个配置函数,该函数接受目标配置结构体的指针,并修改其中的配置。
- 在主函数中应用选项:在需要的地方,接受这些配置函数,并将其应用于默认配置。
示例
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| type Config struct { Host string Port int TLS bool Timeout int }
type Option func(*Config)
func WithHost(host string) Option { return func(c *Config) { c.Host = host } }
func WithPort(port int) Option { return func(c *Config) { c.Port = port } }
func NewConfig(options ...Option) *Config { config := &Config{ Host: "localhost", Port: 8080, TLS: false, Timeout: 30, }
for _, option := range options { option(config) }
return config }
|
注册表模式 + 依赖注入模式
注册表模式使用场景
- 存储和管理系统的配置。
- 跨不同组件共享单例实例。
- 动态加载类或框架组件。
注册表示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| type Service interface { Execute() }
type Registry struct { mu sync.RWMutex services map[string]Service }
func (r *Registry) Register(name string, service Service) { r.mu.Lock() defer r.mu.Unlock() r.services[name] = service }
func (r *Registry) Get(name string) Service { r.mu.RLock() defer r.mu.RUnlock() return r.services[name] }
|
依赖注入
将对象的依赖关系从内部管理转移到外部,从而使得对象的创建与其所依赖的对象解耦。
两种模式如何结合?
可将Service interface
改成函数定义
,示例:
1
| type Service func(provider string) error
|