首页 > 其他分享 >golang实现设计模式之抽象工厂模式总结-代码、优缺点、适用场景

golang实现设计模式之抽象工厂模式总结-代码、优缺点、适用场景

时间:2023-05-31 15:57:49浏览次数:50  
标签:func 优缺点 模式 工厂 golang 实例 产品 设计模式 type

抽象工厂模式也是一种创建型的设计模式,其是在工厂模式的基础上实现更高程度的内聚。我们知道在工厂模式中,一种产品类就需要新建个对应的工厂类生成产品的实例,这会有什么问题呢?

虽然工厂模式解决了简单工厂模式不好扩展的问题,实现了OCP,但一种产品就需要新建一个工厂类,比如有10000种产品,是不是也是新建10000个工厂类呢?看到没,这就是问题所在,即使利于扩展,无奈代码臃肿,而且有些产品可以提出共性,尽量复用就成为了改进的目标。

抽象工厂模式就是实现了比较好的内聚,将原来工厂模式下的一种产品类等级,优化为多个有一定关联的产品类聚合在一起。

下面老规矩,看看抽象模式的优缺点、适用场景、代码实现。

优缺点

  • 优点

1.具备工厂方法的优点。

2.同时由于可以聚合多个产品族的共性,不用创建新类来管理。

  • 缺点

1.产品族的扩展将是一件十分费力的事情。新增产品时,所有工厂类需要联动修改,所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的。

适用场景

  • 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。

代码实现

package main

import "fmt"

func main()  {
   var f factory
   f = new(concreteFactoryA)
   p := f.createPhoneFactory()
   p.use()
   w := f.createSmartWatchFactory()
   w.healthWatcher()
}

// 1.cellphone interface
type iCellphone interface {
   use()
}

// 1.smart watch interface
type iSmartWatch interface {
   healthWatcher()
}

// 2.concrete cellphone product
type iphoneProduct struct {

}

func (r *iphoneProduct) use()  {
   fmt.Println("Iphone can be dialing.")
}

type miPhoneProduct struct {

}

func (r *miPhoneProduct) use()  {
   fmt.Println("miPhone can be dialing.")
}

type iWatchProduct struct {

}

func (r *iWatchProduct) healthWatcher()  {
   fmt.Println("iWatch can monitor your health.")
}

type oppoWatchProduct struct {

}

func (r *oppoWatchProduct) healthWatcher()  {
   fmt.Println("oppoWatch can monitor your health.")
}

type phoneTyp int

type watchType int

const (
   iphoneType = 0 + iota
   miPhoneTyp
)

const (
   iWatchType = 10000 + iota
   oppoWatchTyp
)

// 3.factory interface
type factory interface {
   createPhoneFactory() iCellphone
   createSmartWatchFactory() iSmartWatch
}

// 4.concrete product factory
// apple product
type concreteFactoryA struct {

}

func (r *concreteFactoryA) createPhoneFactory() iCellphone {
   return &iphoneProduct{}
}

func (r *concreteFactoryA) createSmartWatchFactory() iSmartWatch {
   return &iWatchProduct{}
}

// other brands product
type concreteFactoryB struct {

}

func (r *concreteFactoryB) createPhoneFactory() iCellphone {
   return &miPhoneProduct{}
}

func (r *concreteFactoryB) createSmartWatchFactory() iSmartWatch {
   return &oppoWatchProduct{}
}

工厂模式系列目前就结束了,这里做个简单总结:

  • 1.简单工厂模式,客户端只要请求工厂类,传入不同的参数,进而获取到对应的产品实例,客户端不用关心其实现细节,只管获取实例使用即可,实现了创建实例与使用实例的隔离。这种设计模式适合于创建产品种类比较少的情景,如果产品种类很多,可想而知,我们都通过一个工厂类的生成方法来获取,必然涉及到修改新建实例代码,不就违背了 OCP 原则吗。所以对于新建和删除工厂方法中的相关涉及的产品,这也是问题。而且就这一个工厂方法来生成所有的产品的实例,产品多了,代码就臃肿了,使得该方法职责过重。

  • 2.工厂模式,为了解决工厂方法只有一个,职责过重,工厂模式中通过一种产品对应一个具体的工厂类去实现实例的生成,一定程度上解耦了功能,另外如果新增产品,我们只需要多写个产品类和对象的工厂类及方法,这也很好的实现了 OCP原则,对扩展开放,对修改关闭。当然这也有问题,就是产品多了,每个产品都需要新建个对应的工厂类,况且有些产品也并不是完全不相关,内聚性就变差了。工厂模式适用于客户端不关心实例产生细节,另外实例的实际创建会推迟到子类工厂中实现。

  • 3.抽象工厂模式,既然工厂模式每个产品都需要实现对应的工厂类去生成相关实例,提取产品的共性,提高代码的内聚性,就是抽象工厂模式要干的。在抽象工厂中,依然是不同产品对应不同的工厂类,但可以尽可能将具有相同共性的产品类别合在一起,从而提高了内聚性。但同时也带来一些问题,比如修改产品类,可能涉及到对应的工厂类都需要改动,OCP原则有没有很好的遵守,而且通过更加地抽象化,也增加了代码的理解难度。

没有万能的设计模式,只有合适的,有的时候也不必过于拘泥于规则,实际编码中,尽量遵守,寻找到合适的模式,让代码实现高内聚、低耦合、可扩展。

参考:

标签:func,优缺点,模式,工厂,golang,实例,产品,设计模式,type
From: https://www.cnblogs.com/davis12/p/17446368.html

相关文章

  • golang实现设计模式之工厂模式总结-代码、优缺点、适用场景
    工厂模式也是一种创建型模式,它与简单工厂不同的是将实例的创建推迟到具体的工厂类方法中实现,每一种产品生成一个对应的工厂,从而替换掉简单工厂方法模式中那个静态工厂方法。所以在工厂模式中,不同产品就由不同的工厂生产,每次增加产品时,我们就不需要在类似在简单工厂中,在统一的工厂......
  • Golang扫盲式学习——GO并发 | (一)
    并发与并行......
  • Abstract Factory Pattern 抽象工厂模式简介与 C# 示例【创建型】【设计模式来了】
    〇、简介1、什么是抽象工厂模式?一句话解释:  通过对抽象类和抽象工厂的一组实现,独立出一系列新的操作,客户端无需了解其逻辑直接访问。抽象工厂模式(AbstractFactoryPattern)是一种创建型模式。它用于创建一组相关对象的家族。强调的是一组对象之间的协作关系,而不是单个对象之......
  • 技术招聘漫谈 | 正在招Golang工程师的你,赶快收藏这份识人秘籍!
    各位技术面试官,欢迎来到新一期的技术招聘漫谈专栏。在前两期的专栏中,我们解析了前端工程师以及 Java工程师 这两个常见技术岗位的招聘技巧。今天,我们想把目光聚焦在一个前景与“钱”景都非常火热的岗位——Golang开发工程师。《腾讯2022年度研发大数据报告》显示,Golang连......
  • gof-设计模式
    一、什么是设计模式设计模式(Designpattern)是解决软件开发某些特定问题而提出的一些解决方案也可以理解成解决问题的一些思路。通过设计模式可以帮助我们增强代码的可重用性、可扩充性、可维护性、灵活性好。我们使用设计模式最终的目的是实现代码的高内聚和低耦合。1、创建型......
  • 模板模式:一种体现多态的设计模式
    0x01:模板模式模板模式(Template),又叫模板方法模式(TemplateMethod),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需重写方法实现,但调用将以抽象类中定义的方式进行。模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,......
  • 面相对象设计模式目录
    写了个具体模式代码实现示例(c#):https://gitee.com/idasheng/DesignPattenDemo更新于:2023.5.30......
  • golang链式调用
    简单举例packagemain//主要就是前一个方法的返回值,具有下一个方法,因此可以实现链式调用import"fmt"typeStustruct{ Namestring Ageint}func(p*Stu)SetName(namestring)*Stu{ p.Name=name returnp}func(p*Stu)SetAge(ageint)*Stu{ p.Age......
  • 一次折腾 Golang 泛型、反射和 gorm 框架的记录
    事情的起初是一个很常见的需求:批量更新多条记录的相同字段,每条记录对应的字段值不同因此无法批量Update。看着没啥难度却没想到从开头到结束整整花了一天的时间,遂有此文。首先尝试了gorm自带的Save(),按理说gorm本身会自动识别零值不去更新,这样直接创建一个实例数组挨个赋值......
  • Factory Method Pattern 工厂方法模式简介与 C# 示例【创建型】【设计模式来了】
    〇、简介1、什么是工厂方法模式?一句话解释:  实体类和工厂类均为单独实现,不影响已实现的类,方便扩展。工厂方法模式(FactoryMethodPattern)是一种创建型模式,它允许客户端通过工厂方法来创建对象,而不是直接使用构造函数。这样可以让客户端代码更加灵活,同时保持实现的独立性。工......