关于Golang面试宝典

最近几年,Go的热度持续飙升,国内外很多大公司都在大规模的使用Go。Google是Go语言诞生的地方,其他公司如Facebook、腾讯、阿里、字节跳动、百度、京东、小米等都在拥抱和转向Go。Go语言的开源项目也非常多,如kubernetes、docker、etcd。

随着市场对Go语言人才需求的增长,很多开发者都投入了Go语言的怀抱。本系列文章将以第一视角与大家一同开始Golang的面试之路,希望大家能够有所收获,拿下心仪的offer。

使用Go实现23种设计模式——创建型模式

单例模式

一个类只能生成一个实例,提供一个全局访问点供外部获取该实例

适用场景:

  1. 只要求生成一个全局对象
  2. 需要频繁实例化,而创建的对象又频繁被销毁

Go语言实现

单例模式优点

  1. 在内存中只有一个实例,减少了内存开销
  2. 避免对资源的多重占用

单例模式缺点

  1. 没有接口,无法继承,一定程度上违背了单一职责原则(一个类应该只关心内部逻辑,而不关心外面怎么样来实例化)

工厂模式

定义一个创建对象的接口,让子类决定实例化哪个类

适用场景

父工厂类中只有创建产品的抽象接口,将产品对象的实际创建工作推迟到具体子工厂类当中

Go语言实现

工厂模式优点

  1. 符合开闭原则,有很强的扩展性、弹性和可维护性,修改时只需要添加对应的工厂类即可
  2. 使用了依赖倒置原则,依赖抽象而不是具体
  3. 使用者只需要知道产品的具体工厂,无需知道工厂中产品的创建过程,甚至不需要知道产品的类名

工厂模式缺点

  1. 每增加一个产品时,都需要一个具体类和一个具体创建者,使得类的个数成倍增加,导致系统复杂性增加

抽象工厂模式

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类

适用场景

系统中有多个产品类,但每次只使用其中的某一类产品

Go语言实现

抽象工厂模式优点

  1. 隔离了具体类的生产,客户并不知道什么将被创建
  2. 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象
  3. 新增具体工厂和产品族方便

抽象工厂模式缺点

  1. 增加新的产品等级结构复杂,需要修改抽象工厂及所有的具体工厂类

建造者模式

将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象(对复杂对象进行分模块创建)

适用场景

对象可以分模块初始化

Go语言实现

建造者模式优点

  1. 封装性好
  2. 扩展性好

建造者模式缺点

  1. 增加类数量,产生多余的Builder对象
  2. 如果产品内部发生变化,则建造者也要同步修改,后期维护成本较大

原型模式

用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象

适用场景

  1. 不同对象之间相似度高
  2. 创建对象比较麻烦,但复制比较简单

Go语言实现

原型模式优点

  1. 性能优良
  2. 可以使用深克隆方式保存对象状态

原型模式缺点

  1. 需要为每个类实现一个克隆方法,该方法位于类的内部,当对已有类进行改造的时候,需要修改代码,违反了开闭原则
  2. 深拷贝与浅拷贝的风险,容易出错