工厂方法模式(Factory Method)是一种创建型设计模式,它定义了一个用于创建对象的接口,让子类决定将哪些类实例化。工厂方法模式使得一个类的实例化延迟到其子类。
下面是一个 Golang 实现工厂方法模式的示例代码:
// 定义产品接口
type Product interface {
GetName() string
}
// 定义具体产品 A
type ProductA struct {}
func (p *ProductA) GetName() string {
return "Product A"
}
// 定义具体产品 B
type ProductB struct {}
func (p *ProductB) GetName() string {
return "Product B"
}
// 定义工厂接口
type Factory interface {
CreateProduct() Product
}
// 具体工厂 A,生产产品 A
type FactoryA struct {}
func (f *FactoryA) CreateProduct() Product {
return &ProductA{}
}
// 具体工厂 B,生产产品 B
type FactoryB struct {}
func (f *FactoryB) CreateProduct() Product {
return &ProductB{}
}
func main() {
factoryA := &FactoryA{}
productA := factoryA.CreateProduct()
fmt.Println(productA.GetName())
factoryB := &FactoryB{}
productB := factoryB.CreateProduct()
fmt.Println(productB.GetName())
}
在这个示例中,我们定义了产品接口 Product
,并且有两个具体产品实现了该接口:ProductA
和 ProductB
。同时,我们还定义了一个工厂接口 Factory
,并且有两个具体工厂实现了该接口:FactoryA
和 FactoryB
。FactoryA
生产产品 A,FactoryB
生产产品 B。
在代码最后,我们使用具体工厂创建了两个产品,并且打印出它们的名称。
工厂方法模式的优点是:
- 客户端和具体产品之间解耦,客户端无需关心具体产品是如何创建的。
- 增加新产品时,只需要增加一个具体产品类和相应的具体工厂类即可,无需修改现有代码。
缺点是:
- 每新增一个产品就需要新增一个具体产品类和相应的具体工厂类,如果产品种类过多,会导致类的数量急剧增加,不易维护。
- 由于增加了抽象层,增加了系统的复杂度。