抽象工厂是一种设计模式,它提供了一个接口,用于创建相关或依赖对象的系列,而无需指定其具体类。在 Go 中,抽象工厂可以通过定义一个接口来实现。
以下是一个示例代码,展示了如何使用抽象工厂模式:
package main
import "fmt"
// 定义接口
type Vehicle interface {
NumWheels() int
NumSeats() int
}
// 具体产品
type Car struct {}
func (c *Car) NumWheels() int {
return 4
}
func (c *Car) NumSeats() int {
return 5
}
type Motorcycle struct {}
func (m *Motorcycle) NumWheels() int {
return 2
}
func (m *Motorcycle) NumSeats() int {
return 2
}
// 抽象工厂
type VehicleFactory interface {
CreateVehicle() Vehicle
}
// 具体工厂
type CarFactory struct {}
func (cf *CarFactory) CreateVehicle() Vehicle {
return &Car{}
}
type MotorcycleFactory struct {}
func (mf *MotorcycleFactory) CreateVehicle() Vehicle {
return &Motorcycle{}
}
func main() {
// 使用 Car 工厂创建车辆
carFactory := &CarFactory{}
car := carFactory.CreateVehicle()
fmt.Printf("Car has %d wheels and %d seats\n", car.NumWheels(), car.NumSeats())
// 使用 Motorcycle 工厂创建车辆
motorcycleFactory := &MotorcycleFactory{}
motorcycle := motorcycleFactory.CreateVehicle()
fmt.Printf("Motorcycle has %d wheels and %d seats\n", motorcycle.NumWheels(), motorcycle.NumSeats())
}
在上面的示例中,我们定义了一个 Vehicle
接口和两个具体产品:Car
和 Motorcycle
。接着我们定义了一个 VehicleFactory
接口来创建 Vehicle
,并实现了两个具体工厂:CarFactory
和 MotorcycleFactory
。最后,我们使用这些工厂来创建车辆,并输出车辆的属性。
抽象工厂模式的优点是可以轻松地添加新产品系列而无需更改客户端代码,因为客户端只与接口交互,而不是具体实现。缺点是当需要添加新方法或修改方法签名时,所有工厂类都必须进行相应的更改,这可能会带来一些困难。