Router 接口只有一个 Run 方法,本质上来说,我们搞一个 工厂函数就可以实现多态的方式。但是一种更佳的实践是使用工厂接口(或者叫抽象工厂模式, 或者说是工厂的工厂)。
例如这里的 Factory 接口, 比如我们的具体实现中有 gin factory, mux factory, 每个 factory 可以持有自己需要的众多对象,并且在 New Router 时,将这些对象赋值给 Router。这就将 Router 依赖的对象从 New Router 时传入,改为了在 New Facotry 时传入。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
// Router sets up the public layer exposed to the users type Router interface { Run(config.ServiceConfig) }
// RouterFunc type is an adapter to allow the use of ordinary functions as routers. // If f is a function with the appropriate signature, RouterFunc(f) is a Router that calls f. type RouterFunc func(config.ServiceConfig)
// Run implements the Router interface func(f RouterFunc) Run(cfg config.ServiceConfig) { f(cfg) }
// Factory creates new routers type Factory interface { New() Router NewWithContext(context.Context) Router }