🏭简单工厂模式(Simple Factory)
参考
现实生活中的例子:
考虑一下,你正在建房子,你需要门。你可以穿上你的木匠衣服,带上一些木头,胶水,钉子和建造门所需的所有工具,然后开始在你的房子里建造它
或者你可以简单地打电话给工厂并把内置的门送到你这里不需要了解关于制门的任何信息或处理制作它所带来的混乱。
通俗解释:
简单工厂只是为客户端生成一个实例,而不会向客户端公开任何实例化逻辑。
维基百科:
在面向对象编程(OOP)中,工厂是用于创建其他对象的对象 - 正式工厂是一种函数或方法,它从一些方法调用返回变化的原型或类的对象,这被假定为“新”。
Go代码实现
package main
import (
"fmt"
)
// 定义接口
type Car interface {
Drive()
}
// 定义具体类型
type Sedan struct{}
func (s Sedan) Drive() {
fmt.Println("Driving a sedan car")
}
type SUV struct{}
func (s SUV) Drive() {
fmt.Println("Driving an SUV")
}
// 定义工厂
type CarFactory struct{}
func (cf CarFactory) CreateCar(carType string) Car {
switch carType {
case "sedan":
return Sedan{}
case "suv":
return SUV{}
default:
return nil
}
}
func main() {
factory := CarFactory{}
// 创建轿车
sedan := factory.CreateCar("sedan")
if sedan != nil {
sedan.Drive()
} else {
fmt.Println("Invalid car type")
}
// 创建SUV
suv := factory.CreateCar("suv")
if suv != nil {
suv.Drive()
} else {
fmt.Println("Invalid car type")
}
}
在这个例子中,我们定义了一个 Car
接口,然后实现了两个具体的车型类型 Sedan
和 SUV
,它们都实现了 Car
接口的 Drive
方法。
接着,我们定义了一个 CarFactory
结构体,其中的 CreateCar
方法根据传入的参数创建不同类型的汽车对象。
在 main
函数中,我们使用 CarFactory
来创建轿车和 SUV 对象,并调用其 Drive
方法来模拟驾驶。
这个例子展示了如何使用简单工厂模式来创建不同类型的汽车对象,从而将对象的创建与使用分离开来。你可以根据需要扩展更多的车型和逻辑来完善这个例子。
在上面的 “造车” 的例子中,定义 Car
接口的目的是为了实现简单工厂模式,并且将不同类型的汽车对象统一起来,使它们能够在同一接口下提供相同的方法。
具体原因如下:
- 多态性和灵活性: 定义了
Car
接口后,不同类型的汽车(例如轿车、SUV)可以实现相同的接口方法Drive()
。这使得在客户端代码中可以使用多态性,即通过统一的接口调用不同类型的汽车对象,从而实现更灵活的代码编写和运行时行为。 - 解耦合: 客户端代码只需要依赖于
Car
接口,而不需要关心具体的汽车类型。这样可以降低代码的耦合度,使得客户端代码与具体的汽车实现解耦,方便后续扩展和维护。 - 适应变化: 如果将来需要添加新的汽车类型,只需要确保新的类型实现了
Car
接口的方法即可,无需修改客户端代码。这种适应变化的能力是接口的一个重要优势。 - 单一职责原则: 定义了
Car
接口后,每个汽车类型只需要关注实现自己的Drive()
方法,遵循了单一职责原则,使得每个类型只负责自己的功能。
总之,定义 Car
接口的主要目的是为了实现代码的可扩展性、灵活性和解耦合,从而使得不同类型的汽车对象可以以一致的方式被使用和管理。这符合面向对象编程的设计原则和最佳实践。
评论区