golang设计模式之抽象工厂模式

抽象工厂模式

简介

wiki: 抽象工厂模式(英语:Abstract factory pattern)是一种软件开发设计模式。抽象工厂模式提供了一种方式,能够将一组具备同一主题的单独的工厂封装起来。在正常使用中,客户端程序须要建立抽象工厂的具体实现,而后使用抽象工厂做为接口来建立这一主题的具体对象。客户端程序不须要知道(或关心)它从这些内部的工厂方法中得到对象的具体类型,由于客户端程序仅使用这些对象的通用接口。抽象工厂模式将一组对象的实现细节与他们的通常使用分离开来。git

在前面的文章中咱们介绍过工厂模式的前两种:github

而今天要介绍的 抽象工厂模式 就是工厂模式中的最后一种了,是前两种模式的补充,设计模式

工厂模式用来建立一组相关或者相互依赖的对象,与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构, 咱们能够将一种产品等级想象为一个产品族,所谓的产品族,是指位于不一样产品等级结构中功能相关联的产品组成的家族。框架

代码实现

仍是以 工厂方法模式 中咱们举的卖包子的例子:post

在以前的工厂方法中,须要在齐市和广东开两家包子店,那么就须要从一个工厂接口中实现两个工厂结构体,齐市店和广东店属于两个产品族,猪肉包和三鲜馅包子属于同一个等级结构,ui

因此在抽象工厂模式中,咱们要添加两个工厂,每一个工厂实现两个产品的建立方法:spa

  1. 工厂接口和产品接口设计

    type FactoryInterface interface {
       	CreatePigMeatBuns() ProductInterface // 建立猪肉馅产品
       	Create3SBuns() ProductInterface      // 建立三鲜馅产品
       }
       
       type ProductInterface interface {
       	Intro()
       }
    复制代码
  2. 实现4种产品

type GDPigMeatBuns struct {
  }

  func (p GDPigMeatBuns) Intro() {
      fmt.Println("广东猪肉馅包子")
  }
  // TODO ... 其余产品实现方法没区别... 就省略掉了,须要的话请去仓库里看源码
复制代码
  1. 实现工厂
// 齐市包子铺 
  type QSFactory struct {
  }

  func (qs QSFactory) CreatePigMeatBuns() ProductInterface {
      return QSPigMeatBuns{}
  }

  func (qs QSFactory) Create3SBuns() ProductInterface {
      return QS3SBuns{}
  }
  // 广东包子铺
  type GDFactory struct {
  }

  func (gd GDFactory) CreatePigMeatBuns() ProductInterface {
      return GDPigMeatBuns{}
  }

  func (gd GDFactory) Create3SBuns() ProductInterface {
      return GD3SBuns{}
  }
复制代码
  1. 这样就能够经过抽象工厂建立了

    var f FactoryInterface  // 特地以这种方式声明,更好的体会抽象工厂模式的好处
       	f = new(QSFactory)  
       	b := f.CreatePigMeatBuns()  
       	b.Intro()
    复制代码

优缺点

  • 优势: 抽象工厂模式除了具备工厂方法模式的优势外,最主要的优势就是能够在类的内部对产品族进行约束。所谓的产品族,通常或多或少的都存在必定的关联,抽象工厂模式就能够在类内部对产品族的关联关系进行定义和描述,而没必要专门引入一个新的类来进行管理。

  • 缺点: 产品族的扩展将是一件十分费力的事情,假如产品族中须要增长一个新的产品,则几乎全部的工厂类都须要进行修改。因此使用抽象工厂模式时,对产品等级结构的划分是很是重要的

总结

如今咱们就讲完了三种工厂模式的构建了,他们之间有区别又有联系,具体使用什么模式,就见仁见智了,常常性的,当业务发展过程当中,会从简单工厂模式一步一步变成工厂方法,或者抽象工厂模式

建立型设计模式的结果都是获得指定对象,模式之间没有好坏,按需使用,只要可以达到解耦的目的,就是好模式。

上述代码均放在 golang-design-patterns 这个仓库中

打个广告,推荐一下本身写的 go web框架 bingo,求star,求PR ~

相关文章
相关标签/搜索