Go 设计模式-工厂设计模式

140 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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 函数是对外可见,其他具体细节实现的封装都不对外。