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

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

时间:2023-05-31 14:12:05浏览次数:47  
标签:struct show 优缺点 模式 工厂 golang 产品 设计模式 type

工厂模式也是一种创建型模式,它与简单工厂不同的是将实例的创建推迟到具体的工厂类方法中实现,每一种产品生成一个对应的工厂,从而替换掉简单工厂方法模式中那个静态工厂方法。所以在工厂模式中,不同产品就由不同的工厂生产,每次增加产品时,我们就不需要在类似在简单工厂中,在统一的工厂类方法中修改,而是通过直接新建产品类,新建生产该产品的工厂类,通过这种模式,我们就可以解决简单工厂中的违背 OCP 的问题,对后期的代码扩展有利。

我们在应用工厂模式时,主要的结构设计包括如下:

  • 1.定义产品接口,声明相关方法
  • 2.定义具体产品,实现产品接口
  • 3.定义工厂接口,声明工厂通用方法
  • 4.定义不同产品的工厂类,实现工厂接口,工厂类和产品类往往依次对应
  • 5.客户端需要生成哪种实例,就去请求对应的产品工厂生成实例

当然工厂模式也不是万能的,也有优缺点。

优缺点

  • 优点:不直接在客户端创建具体产品的实例,降低了耦合性

1.不关心创建细节: 用户只需要关心所需产品对应的工厂, 无需关心创建细节;

2.符合开闭原则: 加入新产品,符合开闭原则, 提高可扩展性;

  • 缺点:每增加一种产品就要相应的增加一个工厂类,类增多了。

1.增加复杂性 : 类的个数容易过多, 增加系统复杂度 ;

在添加新产品时, 除了编写新的产品类之外, 还要编写该产品类对应的工厂类 ;

2.增加难度: 增加了系统抽象性和理解难度 ;

工厂方法本身利用了抽象, 该模式中会引入抽象层, 如果要动态创建产品类, 还要引入反射技术;

适用场景

  • 1.重复代码: 创建对象需要使用大量重复的代码;
  • 2.不关心创建过程: 客户端不依赖产品类, 不关心实例如何被创建, 实现等细节;
  • 3.创建对象: 一个类通过其子类来指定创建哪个对象。

代码实现

package main

import "fmt"

// 1.product interface
type iProduct interface {
   show()
}

// 2.product struct
type iphoneProduct struct {

}

func (r *iphoneProduct) show()  {
   fmt.Println("This is iphone.")
}

type ipadProduct struct {

}

func (r *ipadProduct) show()  {
   fmt.Println("This is ipad.")
}

// 3.factory interface
type factory interface {
   produce() iProduct
}

// 4.concrete factory
type iphoneFactory struct {

}

func (r *iphoneFactory) produce() iProduct {
   return &iphoneProduct{}
}

type ipadFactory struct {

}

func (r *ipadFactory) produce() iProduct {
   return &ipadProduct{}
}

func main()  {
   f1 := &iphoneFactory{}
   f1.produce().show()

   f2 := &ipadFactory{}
   f2.produce().show()
}

参考:

标签:struct,show,优缺点,模式,工厂,golang,产品,设计模式,type
From: https://www.cnblogs.com/davis12/p/17445941.html

相关文章

  • 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)是一种创建型模式,它允许客户端通过工厂方法来创建对象,而不是直接使用构造函数。这样可以让客户端代码更加灵活,同时保持实现的独立性。工......
  • 过滤器链及责任链设计模式
    过滤器链:在JavaWeb应用中,多个过滤器的执行顺序是有规定的,称之为过滤器链。按照过滤器链的规定,多个过滤器会按照它们在web.xml文件中配置的先后顺序依次执行。具体来说,假设一个请求需要经过三个过滤器,分别为Filter1、Filter2和Filter3,那么它们的执行顺序为:客户端发送请......