返回顶部
首页 > 资讯 > 后端开发 > GO >Golang设计模式工厂模式实战写法示例详解
  • 700
分享到

Golang设计模式工厂模式实战写法示例详解

2024-04-02 19:04:59 700人浏览 泡泡鱼
摘要

目录拆出主板工厂模式流程代码实战抽象能力,定义接口实现工厂,支持注册和获取实现主流程只依赖接口完成扩展 => 适配器,实现接口注册适配器到工厂里小结拆出主板 今天带大家看一下怎

拆出主板

今天带大家看一下怎么用 Go 写工厂模式的代码,我们来学习一个实战案例。这个写法笔者日常经常使用,能够很有效地帮助大家实现 Separation of Concerns。

主板就是一个程序的主流程。比如我们要基于一份学习资料来消化,吸收知识。我们可能有下面几步流程:

  • 准备好笔记本;
  • 打开资料;
  • 阅读资料内容,思考并记录关键点到笔记本上;
  • 做资料里包含的练习题;
  • 归纳总结,验证掌握程度。

这个资料,可以是纸质书籍,可以是电子书,可以是某个平台的专栏,形式有很多,但我们不 care,因为在主题流程中,只需要它是个资料,有资料的能力即可。

换句话说,我们把资料转换成一个 interface,定义如下:

type KnowledgeMaterial interface{
	GetContent() string
	GetExercises() []string
}

能给我们主体内容,能给我们练习题,满足这两点就够了。

所以,主板本质上是不 care 具体这个资料是什么的。

扩展则是基于 interface 的实现,或者类比一下 adapter,就是个适配器。我们可以定义出来 Book, Ebook, Column 各种各样的扩展,它们都实现了这个 KnowledgeMaterial 接口。

很多同学写代码的时候,拆不开主板,不知道自己的核心流程是什么,这一点是非常重要的。拆不出来【主流程】,就意味着你需要针对某个实体实现逻辑时,直接依赖了这个【实现】。

比如我们上面的 case,没有 KnowledgeMaterial 接口,你的流程变成了,翻开纸质书第一页,看看目录,然后翻到第一章,开始阅读书上的文字。。。。

这是很可怕的一件事,意味着一旦结构变了,你的代码是不可能适配的。你会需要各种 if else 来判断到底是哪种类型。如果后来又来了一种学习资料,叫做【视频课程】,这时候怎么办呢?

没有页供你翻了,你面对的实体变成了视频内容,想要适配,就势必不是容易的事。

所以,大家一定要练习这个能力,遇到问题,思考自己的主流程是什么,拆出主板,然后明确你对业务实体的诉求是什么,能否抽象化。

是一个实现了KnowledgeMaterial 接口的任意实体就 ok?还是必须得是 Book 这个具体的结构体才 ok?

如果你需要的只是个接口,能够抽象简化,就尽量用我们今天要说的工厂模式来做,这样你的主流程心智负担会小很多,此后新增扩展成本也很小。

工厂模式流程

  • 抽象出对实体的能力要求,变成接口;
  • 实现工厂,支持适配器注册,支持根据类型获取对应的接口实现;
  • 主流程只依赖接口完成;
  • 将你的扩展,变成 adapter 适配器,实现接口所要求的的能力;
  • 将你的适配器通过第二步里提到的方法,注册到工厂里。

这样的好处就在于,主板和扩展隔离,新增扩展的时候,只需要新增,不需要动主流程,不需要动其他扩展,避免了一大堆 if else 的写法。

代码实战

我们结合一开始提到的 KnowledgeMaterial 接口来简单示例一下。

抽象能力,定义接口

type KnowledgeMaterial interface{
	GetContent() string
	GetExercises() []string
}

实现工厂,支持注册和获取实现

新建一个 factory.go 文件,填充如下内容:


type KnowledgeAdapterFactory struct {
	sync.RWMutex
	adapters []KnowledgeAdapter
}
var (
	knowledgeAdapterFactory = KnowledgeAdapterFactory{
		adapters: []KnowledgeAdapter{},
	}
)
// ReGISterKnowledgeAdapter 注册新的知识资料适配器
func RegisterKnowledgeAdapter(adapter KnowledgeAdapter) {
	knowledgeAdapterFactory.Lock()
	knowledgeAdapterFactory.adapters = append(knowledgeAdapterFactory.adapters, adapter)
        knowledgeAdapterFactory.Unlock()
}
// GetAllKnowledgeAdapters 获取所有知识资料适配器
func GetAllKnowledgeAdapters() []KnowledgeAdapter {
	return knowledgeAdapterFactory.adapters
}

主流程只依赖接口完成

重点关注和 adapter 相关的逻辑,其他部分省略:

func LearnKnowledge() {
	//准备好笔记本
	notes := openNotesForWrite()
	for _, adapter := range GetAllKnowledgeAdapters() {
		content := adapter.GetContent()
		// 阅读资料内容,思考并记录关键点到笔记本上
		writeNotes(content)
		// 做资料里包含的练习题
		for _, ex := range adapter.GetExercises() {
			doExecise(ex)
		}
	}
	// 归纳总结,验证掌握程度
	summary()
}

扩展 => 适配器,实现接口

新建一个包:book,用于实现纸质书籍的适配器。在其中新建 adapter.go 文件,填充如下代码

type Adapter struct {}
func (a *Adapter) GetContent() string {
	return "xxx"
}
func (a *Adapter) GetExercises() []string {
	return []string{"xxx"}
}

注册适配器到工厂里

这里写法其实相对灵活,很多人会选择直接在工厂定义的 factory.go 写注册逻辑,我个人不太喜欢这样。这就意味着每次新增适配器,都需要动工厂。

比较推荐直接在适配器的 init() 函数中完成注册,然后在 main 函数启动时 import 包进来,就执行了 init 函数。

这样写的好处在于当你新增一个扩展的时候,主流程和工厂都不需要动,只新增文件就好。

我们可以把上面的 adapter.go 新增一个函数即可:

type Adapter struct {}
func init() {
	RegisterKnowledgeAdapter(&Adapter{})
}
func (a *Adapter) GetContent() string {
	return "xxx"
}
func (a *Adapter) GetExercises() []string {
	return []string{"xxx"}
}

小结

工厂模式是一个很简单,容易上手的写法,重点还是在于大家要区分开主板和扩展,通过注册方式填充适配器,而不是通过 if else 来区分。希望今天介绍的写法对你有帮助,这里还可以有很多变形,本质是类似的。

以上就是golang 工厂模式实战写法示例详解的详细内容,更多关于Golang 工厂模式的资料请关注编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: Golang设计模式工厂模式实战写法示例详解

本文链接: https://lsjlt.com/news/121121.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Golang设计模式工厂模式实战写法示例详解
    目录拆出主板工厂模式流程代码实战抽象能力,定义接口实现工厂,支持注册和获取实现主流程只依赖接口完成扩展 => 适配器,实现接口注册适配器到工厂里小结拆出主板 今天带大家看一下怎...
    99+
    2024-04-02
  • Java设计模式——工厂设计模式详解
    工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类。工厂模式的形态工厂模式主要用一下几种形态:简单工厂(Simple Factory)。2:工厂方法(Factory Method)。3:抽象工厂(Abstract...
    99+
    2023-05-30
    java 设计模式 ava
  • Java设计模式之工厂模式案例详解
    目录分类案例需求方案一:简单工厂模式方案二:工厂方法模式方案三:抽象工厂模式对比分析总结 分类 1.简单工厂模式 2.工厂方法模式 3.抽象工厂模式 案例 需求 根据蛋糕的不同口味,...
    99+
    2024-04-02
  • PHP设计模式之工厂模式详解
    工厂模式是一种创建型设计模式,它提供了一种统一的方式来创建对象,而不用直接实例化对象。工厂模式可以隐藏对象创建的细节,客户端只需要调...
    99+
    2023-08-14
    php
  • Java设计模式之工厂方法模式详解
    目录1.工厂方法是什么2.如何实现3.代码实现4.工厂方法模式的优点5.拓展1.工厂方法是什么 众所周知,工厂是生产产品的,并且产品供消费者使用。消费者不必关心产品的生产过程,只需要...
    99+
    2024-04-02
  • Golang设计模式中抽象工厂模式详细讲解
    目录抽象工厂模式概念示例抽象工厂模式 抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。 抽象工厂定义了用于创建不同产品的接口, 但将实际的创建工...
    99+
    2023-01-11
    Go抽象工厂模式 Go设计模式
  • java编程创建型设计模式工厂方法模式示例详解
    目录1.什么是工厂方法模式?2.案例实现3.JDK中的工厂方法模式1.什么是工厂方法模式? 工厂方法模式设计方案:  将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐...
    99+
    2024-04-02
  • java设计模式--三种工厂模式详解
    目录简单工厂代码:1.产品接口2.产品接口实现子类3.简单工厂类4.调用工厂5.测试工厂方法代码:1.工厂接口2.工厂实现子类3.产品接口4.产品实现子类5.调用6.测试1.产品接口...
    99+
    2024-04-02
  • JavaScript设计模式之工厂模式的示例分析
    这篇文章主要为大家展示了“JavaScript设计模式之工厂模式的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaS...
    99+
    2024-04-02
  • Java设计模式之工厂模式的示例分析
    这篇文章主要为大家展示了“Java设计模式之工厂模式的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java设计模式之工厂模式的示例分析”这篇文章吧。具体如下:工厂模式主要是为创建对象提...
    99+
    2023-05-30
    java
  • JAVA设计模式之工厂模式(三种工厂模式)
    1.工厂模式可以分为三类: 简单工厂模式(Simple Factory) 工厂方法模式(Factory Method) 抽象工厂模式(Abstract Factory) 简单工厂其实不是一个标准的的设计模式。GOF 23 种设计模式...
    99+
    2023-09-04
    设计模式
  • C++设计模式之简单工厂模式的实现示例
    前言 在我们要使用一个对象时,就必须通过类来实例化对象,也就是需要new一个对象。在new的过程是非常复杂的,要经过读文件->解析文本->创建对象->给属性设值等过...
    99+
    2024-04-02
  • Java设计模式之抽象工厂模式详解
    目录一、什么是抽象工厂模式二、示例程序三、UML一、什么是抽象工厂模式 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类,这称之为抽象工厂模式(Abstract ...
    99+
    2024-04-02
  • python设计模式之抽象工厂模式详解
    抽象工厂模式(Abstract Factory Pattern):属于创建型模式,它提供了一种创建对象的最佳方式。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它...
    99+
    2024-04-02
  • java设计模式之简单工厂模式详解
    简单工厂模式:由一个工厂对象决定创建出哪一种类的实例。抽象类public abstract class People { public abstract void doSth();}...
    99+
    2023-05-31
    java 设计模式 简单工厂
  • PHP设计模式中工厂模式深入详解
    目录简介简单工厂作用适用场景优点缺点代码工厂模式作用适用场景优点缺点代码抽象工厂作用适用场景优点缺点代码三者对比简介 工厂模式属于创建型模式,可以分为三种:简单工厂、工厂模式、抽象工...
    99+
    2022-11-13
    PHP工厂模式 PHP设计模式
  • 【Java】设计模式之单例模式与工厂模式
    ✅作者简介:热爱后端语言的大学生,CSDN内容合伙人 ✨精品专栏:C++面向对象 🔥系列专栏:JavaSE精品总结 文章目录   前言1、设计模式概念及分类2、单例模式2...
    99+
    2023-10-04
    java 单例模式 设计模式
  • java 单例模式和工厂模式实例详解
    单例模式根据实例化对象时机的不同分为两种:一种是饿汉式单例,一种是懒汉式单例。私有的构造方法指向自己实例的私有静态引用以自己实例为返回值的静态的公有的方法饿汉式单例 public class Singleton { private ...
    99+
    2023-05-31
    java 单例模式 工厂模式
  • java设计模式之工厂方法详解
    一、概念         工厂方法模式是类的创建模式,又叫虚拟构造子模式(virtual constructor) 或者多态性工厂模式。二、模式动机 ...
    99+
    2023-05-31
    java 设计模式 工厂方法
  • C#设计模式之工厂模式
    这是我们用得比较多的一种设计模式,也是23种标准设计模式之一,使用前面讲的简单工厂设计模式,遇到具体产品经常变换时就不太适合了,违反了开闭设计原则;怎么才能避免修改工厂类呢?工厂方法...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作