持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第23天,点击查看活动详情
前言
工厂设计模式经常使用于对象的创建,它也是最常用的设计模式之一。在面向对象编程领域中,对象的创建应遵循开闭原则,即对扩展时开放的,修改时封闭的。而工厂设计模式就提供了一种隐藏创建实例的逻辑的方法。
所以,当你只需要传递所需的信息就能够返回你所需要的实例时,就可以使用此模式。
设计思路
设想员工进入一家公司的场景,那肯定需要员工的姓名,职位,工资等信息。
struct Employee {
Name string
Position string
Salary int
}
由于 Go 本身是没有构造函数的,一般而言我们采用 NewName 的方式创建对象/接口。因此,要创建一个实例,我们默认已经有了一些信息(即标准工资和货币),并且需要输入一些信息。
func NewEmployee(name, position string) Employee{
return &Employee{
Name: name,
Position:position,
Salary: 3000
}
}
将所需的值传递给函数,其余的默认值将被添加到函数本身。这样就是简单工厂模式。
让我们看一下包含 main() 函数后的整个代码:
func main(){
emp := NewEmployee("Nanlv","engineer")
fmt.Println("Employee: ", emp)
}
应用场景
- 工厂模式是对象创建模式,主要用于框架或第三方库中,需要创建对象进行进一步处理
- 当场景是构建需要大量对象创建的SDK或框架时
优缺点
-
优点:
- 职责分明,专门的类或函数负责对象的创建,屏蔽细节
-
缺点:
- 不易扩展,如果有新的类型,可能就需要修改创建逻辑
- 如果产品类型比较多,就需要比较复杂的创建逻辑
- 对于 Golang来说,没有构造函数概念就无法支持不同参数返回不同的对象
总结
Golang 没有构造函数,也没有对象的概念。所以一般会定义 NewXXXX 函数来初始化相关类,当作“对象”。所以 NewXXX 函数返回接口时就是简单工厂模式。需要注意的是,整个包里只有 NewXXX 函数是对外可见,其他具体细节实现的封装都不对外。