Go语言中Factory Method模式通过函数值和接口实现,核心是将创建逻辑抽象为可注册的工厂函数;定义Logger接口,提供ConsoleLogger和FileLogger等具体实现及对应构造函数,用map注册工厂函数,运行时按名称动态创建实例。

在 Go 语言中,没有类和继承,所以传统面向对象中的 Factory Method 模式需要换一种思路实现——不靠子类重写方法,而是靠函数值(func() interface{})或接口+构造函数组合来模拟。核心是:**把“创建逻辑”抽象成可替换、可注册的工厂函数,运行时按需调用**。
先定义一个接口,作为所有具体类型的公共抽象。比如我们想动态创建不同类型的日志处理器:
// Logger 是产品接口
type Logger interface {
Log(msg string)
}
每个具体类型实现接口,并提供自己的构造函数(即“工厂方法”的 Go 版本):
// ConsoleLogger
type ConsoleLogger struct{}
func NewConsoleLogger() Logger { return &ConsoleLogger{} }
func (*ConsoleLogger) Log(msg string) { fmt.Println("[CONSOLE]", msg) }
// FileLogger
type FileLogger struct{ filename string }
func NewFileLogger(filename string) Logger { return &FileLogger{filename: filename} }
func (*FileLogger) Log(msg string) { fmt.Printf("[FILE %s] %s\n", f.filename, msg) }
用 map 存储名称到构造函数的映射,构造函数签名统一为 func() Logger(或带参数的闭包):
立即学习“go语言免费学习笔记(深入)”;
var loggerFactories = make(map[string]func() Logger)
// 注册工厂函数(可在 init 或启动时调用)
func init() {
loggerFactories["console"] = NewConsoleLogger
loggerFactories["file"] = func() Logger { return NewFileLogger("app.log") }
}
// 工厂方法:根据 name 返回实例
func CreateLogger(name string) (Logger, error) {
if f, ok := loggerFactories[name]; ok {
return f(), nil
}
return nil, fmt.Errorf("unknown logger type: %s", name)
}
func main() {
// 从命令行、配置文件或 HTTP 请求中读取类型名
logType := "console"
if len(os.Args) > 1 { logType = os.Args[1] }
logger, err := CreateLogger(logType)
if err != nil {
log.Fatal(err)
}
logger.Log("Application started")
}
基本上就这些。Go 的 Factory Method 不依赖继承,而靠组合函数与接口,灵活且无 runtime 开销。关键是把“怎么造”封装进函数,把“造哪个”推迟到运行时决定。
以上就是如何使用Golang实现工厂对象动态生成_使用Factory Method创建实例的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号