抽象工厂是一种创建其他工厂的工厂,它可以一起实现一组相关对象的创建。这种设计模式属于创建型模式,提供了一种创建家族工厂的方法,而无需指定它们的具体类别。
使用场景
我们通常会在以下情况下使用抽象工厂设计模式:
- 当需要生产一组有关联的产品时,例如:苹果电脑需要生产苹果显示器、苹果键盘和苹果鼠标,已达到产品之间的协同工作。
- 当需要将一组抽象概念实现为一组具有依赖关系的实体组件时。
- 当需要遵循开闭原则,而需要添加新功能时,只需扩展原始代码以实现新的工厂和产品。
实现
接下来,我们将用一些例子代码来介绍抽象工厂设计模式,让读者可以更好的理解并实现该模式。
1. 定义所有Button、CheckBox类型的接口
type Button interface {
Paint()
}
type CheckBox interface {
Paint()
}
2. 创建Button、CheckBox的不同类型实现
type WinButton struct{}
func (b WinButton) Paint() {
fmt.Println("WinButton")
}
type OSXButton struct{}
func (b OSXButton) Paint() {
fmt.Println("OSXButton")
}
type WinCheckBox struct{}
func (c WinCheckBox) Paint() {
fmt.Println("WinCheckBox")
}
type OSXCheckBox struct{}
func (c OSXCheckBox) Paint() {
fmt.Println("OSXCheckBox")
}
3. 创建不同UI的抽象工厂
type AbstractFactory interface {
CreateButton() Button
CreateCheckBox() CheckBox
}
type WinFactory struct{}
func (f WinFactory) CreateButton() Button {
return WinButton{}
}
func (f WinFactory) CreateCheckBox() CheckBox {
return WinCheckBox{}
}
type OSXFactory struct{}
func (f OSXFactory) CreateButton() Button {
return OSXButton{}
}
func (f OSXFactory) CreateCheckBox() CheckBox {
return OSXCheckBox{}
}
4. 编写代码使用不同UI工厂来创建具体UI元素
func PaintUI(factory AbstractFactory) {
b := factory.CreateButton()
c := factory.CreateCheckBox()
b.Paint()
c.Paint()
}
func main() {
PaintUI(WinFactory{})
PaintUI(OSXFactory{})
}
在这个示例中,我们首先定义了Button和CheckBox接口。然后我们创建了不同类型的Button和CheckBox实现。接下来,我们定义了创建具体UI元素的抽象工厂,并为不同的UI创建了工厂实现。在main函数中,我们使用不同的UI工厂创建UI元素。
总结
通过使用抽象工厂设计模式,我们能够轻松地创建和管理相关的产品系列。这种模式还能够让我们通过增加具体工厂类来扩展原始代码,并且不需要改变其他的代码。
但是,抽象工厂模式在需要增加新的产品族的时候,会比较困难。因为要在所有的具体工厂类中增加对应产品族的生产方法,同时也需要改动抽象工厂接口和所有的具体工厂类,这样就会导致程序规模急速膨胀。