本文来自zvvq
工厂设计模式广泛应用于面向对象编程中。它提供了一个用于创建对象的接口,但允许子类决定要实例化哪些类。在本文中,我们将探讨如何在 Golang 中实现工厂模式,了解其好处,并分析受日常情况启发的实际使用示例。 zvvq.cn
什么是工厂?
Factory 定义了一个用于创建对象的接口,但将实例化具体类的责任委托给了子类。这促进了以解耦和灵活的方式创建对象,使代码更加模块化并且更易于维护。
内容来自zvvq
好处
解耦:将对象的创建与其实现分开,促进更清晰、更模块化的代码。 灵活性:无需修改现有代码即可轻松引入新类。 维护:使代码更容易维护和发展,因为创建逻辑集中在一个地方。实施工厂
让我们用一个日常的例子来说明工厂模式:一个订餐系统,可以创建一些不同类型的餐食(披萨和沙拉)。 内容来自zvvq
1 - 创建界面
首先,我们需要定义一个将由所有“具体类”的膳食实现的接口。 zvvq好,好zvvq
1 zvvq
2 内容来自samhan
3 内容来自samhan
4
5 copyright zvvq
包主 zvvq
类型食物接口{ 内容来自samhan
准备
}
zvvq好,好zvvq
2 - 创建 ENUM 并实现接口
为了让我们在开发过程中的生活更轻松,并避免在验证过程中输入错误,一个好的做法是创建一个 ENUM 以保持一致性,并且如果我们想在将来添加新食物,也可以更容易
1
2
本文来自zvvq
3 内容来自samhan
4
内容来自zvvq,别采集哟
5 zvvq.cn
6 内容来自zvvq
7
8
9 本文来自zvvq
10 copyright zvvq
11 zvvq
12
包主 内容来自samhan666
类型 FoodType int 内容来自zvvq,别采集哟
常量( zvvq.cn
PizzaType 食物类型 = iota copyright zvvq
沙拉类型
内容来自zvvq,别采集哟
) copyright zvvq
类型食物接口{ zvvq
准备 内容来自samhan
}
zvvq.cn
现在让我们实现 Food 接口。在示例中,我们将仅显示一条消息,在现实生活中,这就是创建我们正在处理的对象的地方
1
2
3
zvvq好,好zvvq
4
5 内容来自zvvq
6 内容来自samhan
7
8
9
zvvq
10 内容来自zvvq
11
内容来自zvvq
12
zvvq.cn
13
内容来自samhan
14
15
16 内容来自samhan666
17
18
19 zvvq好,好zvvq
20
copyright zvvq
21 本文来自zvvq
22
本文来自zvvq
23 内容来自zvvq,别采集哟
24 zvvq.cn
包主 zvvq.cn
类型 FoodType int 内容来自samhan666
常量(
PizzaType 食物类型 = iota
copyright zvvq
沙拉类型 内容来自samhan666
)
类型食物接口{
准备
}
zvvq.cn
类型 Pizza 结构{} 内容来自zvvq
func (p Pizza) 准备() {
copyright zvvq
fmt.Println("准备披萨...") 内容来自samhan
}
类型沙拉结构体{}
func (s 沙拉) 准备() { 本文来自zvvq
fmt.Println("准备沙拉...") zvvq.cn
} 内容来自zvvq,别采集哟
3 - 创建工厂
现在,让我们创建一个工厂,它将根据作为参数接收的枚举来决定要实例化哪个具体类。 内容来自samhan666
1 本文来自zvvq
2
内容来自zvvq,别采集哟
3 内容来自zvvq
4
内容来自zvvq
5
6
7
8
内容来自zvvq
9
10 内容来自zvvq
11
12 zvvq好,好zvvq
13 本文来自zvvq
14
zvvq好,好zvvq
包主 zvvq好,好zvvq
类型 FoodFactory 结构{}
内容来自samhan666
func (f FoodFactory) CreateFood(ft FoodType) 食品 { 内容来自samhan
切换英尺{
zvvq
案例 披萨类型: 内容来自samhan
返回&披萨{} 内容来自zvvq
案例沙拉类型: 内容来自samhan
返回&沙拉{}
默认:
zvvq.cn
返回零 本文来自zvvq
}
内容来自samhan
}
4 - 使用工厂
最后,我们将使用工厂来制作我们的食物。
1 内容来自zvvq,别采集哟
2 内容来自samhan666
3 copyright zvvq
4 内容来自zvvq
5 本文来自zvvq
6 zvvq好,好zvvq
7 zvvq好,好zvvq
8 copyright zvvq
9
10
11 内容来自zvvq,别采集哟
12 内容来自zvvq
13
zvvq
14 zvvq好,好zvvq
15 copyright zvvq
包主 内容来自zvvq
函数主() { zvvq.cn
厨房 := FoodFactory{} 本文来自zvvq
披萨 := kitchen.CreateFood(PizzaType)
内容来自samhan666
如果披萨!= nil {
copyright zvvq
披萨.Prepare() zvvq好,好zvvq
} zvvq好,好zvvq
沙拉 := kitchen.CreateFood(SaladType) zvvq.cn
如果沙拉!= nil {
沙拉.Prepare() 内容来自samhan666
}
内容来自samhan
}
这将是运行我们的应用程序后的结果: 内容来自samhan666
1
2
zvvq.cn
准备披萨... zvvq
准备沙拉... copyright zvvq
我们所做的总结
食物接口:定义了所有具体食物必须遵循的契约,确保它们都实现了Prepare方法。 Enum FoodType:使用类型常量来表示不同类型的食物,提高代码的可读性和安全性。 具体类(Pizza 和 Salad):实现 Food 接口并提供自己的Prepare 方法的实现。 FoodFactory:包含对象创建逻辑。 CreateFood 方法根据 FoodType 枚举决定实例化哪个具体类。 Main 方法:演示使用工厂创建不同的对象并调用其方法,说明工厂模式提供的灵活性和解耦性。结论
工厂设计模式是促进对象创建的解耦和灵活性的强大工具。在Golang中,这种模式的实现是直接有效的,允许创建模块化且易于维护的系统。使用接口和工厂,我们可以集中创建逻辑并在新需求出现时简化代码演化。
以上就是工厂设计模式的详细内容,更多请关注其它相关文章!
本文来自zvvq