go语言中通过接口和工厂函数实现工厂模式,首先定义Product接口,再由Phone和Laptop结构体实现;接着编写CreateProduct函数根据类型创建对应实例,最后在main中调用工厂生成对象并使用。

在Go语言中实现工厂模式,主要是通过函数或结构体封装对象的创建逻辑,避免在代码中直接使用具体的构造过程。这种方式特别适合需要根据条件创建不同类型的对象的场景。下面介绍如何用golang实现一个简单的工厂模式来创建多类型对象。
定义公共接口
为了统一管理多种类型,先定义一个接口,作为所有具体类型的共同抽象。
type Product interface { GetName() string GetPrice() float64 }
这个 Product 接口规定了所有产品必须实现的方法。不同的具体产品类型将实现这些方法。
实现具体类型
接下来编写几个实现了 Product 接口的具体结构体。
立即学习“go语言免费学习笔记(深入)”;
type Phone struct { name string price float64 } func (p *Phone) GetName() string { return p.name } func (p *Phone) GetPrice() float64 { return p.price } type Laptop struct { name string price float64 } func (l *Laptop) GetName() string { return l.name } func (l *Laptop) GetPrice() float64 { return l.price }
这里定义了两个产品:手机(Phone)和笔记本(Laptop),它们都实现了 GetName 和 GetPrice 方法。
编写工厂函数
工厂的核心是一个函数,根据输入参数决定返回哪种类型的对象。
func CreateProduct(productType, name string, price float64) (Product, error) { switch productType { case "phone": return &Phone{name: name, price: price}, nil case "laptop": return &Laptop{name: name, price: price}, nil default: return nil, fmt.Errorf("unknown product type: %s", productType) } }
这个工厂函数接收类型标识、名称和价格,返回对应的 Product 接口实例。如果传入不支持的类型,会返回错误。
使用示例
在 main 函数中调用工厂创建对象:
func main() { phone, err := CreateProduct("phone", "iphone 15", 999.99) if err != nil { log.Fatal(err) } laptop, err := CreateProduct("laptop", "macBook Pro", 2399.00) if err != nil { log.Fatal(err) } fmt.Println(phone.GetName(), phone.GetPrice()) // iPhone 15 999.99 fmt.Println(laptop.GetName(), laptop.GetPrice()) // macbook Pro 2399 }
通过工厂函数,调用方无需知道具体类型的构造细节,只需关心接口行为。新增产品时,只要实现接口并在工厂中添加分支即可,原有代码不用修改。
基本上就这些。这种方式让对象创建更灵活,也更容易维护和扩展。


