首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【建议收藏】如何用Go写出优美的代码-Go的设计模式【简单工厂模式,抽象工厂模式】篇二

【建议收藏】如何用Go写出优美的代码-Go的设计模式【简单工厂模式,抽象工厂模式】篇二

作者头像
公众号-利志分享
发布于 2022-06-13 07:30:11
发布于 2022-06-13 07:30:11
61500
代码可运行
举报
文章被收录于专栏:利志分享利志分享
运行总次数:0
代码可运行

大家好,我是追麾(hui)。

上一次分析完Go的设计模式第一篇,有同学后台问一些设计原则的问题,这篇我们就来讲一下设计的一些原则,然后再继续设计模式的学习。下图是本文提纲。

关于程序设计有六大原则,具体原则如下,当然这个不是Go语言独有的,而是所有的语言都有的。了解了每个程序设计原则的目的,并且运用到我们的程序中去,会让我们的代码可读性高,更加优美,你也会更加爱上写代码。

单一职责原则

定义:一个类或者一个模块只承担一个业务职责,一般地,一个类或者模块内部尽量做到高内聚,不同的类或者模块之间做到低耦合,这样的话代码质量就会很高。在Go语言里面一个struct就算一个对象,如果这个对象加上一些方法就能算一个类。

主要目的:单一职责的原则是让类或者模块的职责更加清晰明确,另外能降低程序复杂度,提高程序可读性和可维护性,也从一定程度下说可能可扩展性要好一些。

开放封闭原则

定义:一个(类、模块、函数等等)可以扩展,但是不可修改。在Go语言里面是没有办法直接通过继承重写的方式实现扩展,但是可以通过组合的方式来实现继承并扩展,后面我们会讲到组合模式会涉及到这个开放封闭原则。

主要目的:开放封闭原则主要是在软件需求发生变化时,目标类和模块的代码可以通过代码扩展实现新的需求,而不是修改已有的类或者模块,主要是防止在已有代码逻辑上修改制造代码缺陷。

里氏替换原则

定义:子类对象必须能够完全替换掉它们的父类对象,而不需要改变父类的任何属性。在Go里面可以通过接口的多重组合来实现继承和多态,但是实现起来是相对比较复杂的。

主要目的:里氏替换原则的核心目的主要是为了实现多态,通过继承的方式重写父类的方法,这样父类定义的对象引用可以通过不同的子类进行调用,然而同一个调用就能表现多态特征。

依赖倒置原则

定义:高层模块不应依赖于低层模块,二者都应该依赖于抽象(抽象类和接口);抽象(抽象类和接口)不应依赖于细节,细节应依赖于抽象(抽象类和接口)。在Go语言中这个原则也是保留的,但是Go只有接口,是没有抽象类。

主要目的:依赖倒置原则主要是解耦的目的,减少类间的耦合性,能提高系统的稳定性,降低并行开发引起的风险,提高代码的可读性和可维护性。

接口分离原则

定义:建立单一接口,不要建立臃肿庞大的接口。再通俗一点讲:接口尽量细化,同时接口中的方法尽量少。在Go语言中接口分离原则原则制定和其他语言没有差异,接口分离原则主要还是由开发者来决定的。

主要目的:接口分离原则主要是为了让接口尽量少,代码抽象度高,可复用性高。在根据接口隔离原则拆分接口时,是必须要满足单一职责原则。

迪米特原则(Least Knowledge Principle)

定义:其实就是知道最少原则,也就是调用涉及的依赖尽可能的小。在Go语言中主要是通过大写方法名来实现让包外进行访问,这样在Go语言中实现迪米特原则也就比较方便了。

主要目的:迪米特原则是降低类间耦合,让类之间弱耦合,只有弱耦合了以后,类的复用率才可以提高,也可以说这个原则是让类之间达到解耦目的。

到这里我算是回答了后台咨询我的同学了,关于设计原则我只分享了定义以及每个设计原则的核心目的是什么,后面分享剩余的设计模式之后也会涉及到这些原则,并且运用到实际的模式中去。比如说第一篇的单例模式,其主要设计的原则是单一职责原则。第一篇工厂方法模式其主要设计的原则参照依赖倒置原则和开放封闭原则。

Go的简单工厂模式

业界简单工厂模式定义:将目标产品创建行为分配给工厂类,由工厂类向客户端提供产品对象创建服务。

简单工厂模式优缺点

  • 优点
    • 提高了代码复用或可维护性:让对象或者方法调用更加方便。
  • 缺点
    • 引入了新的工厂类或者方法

简单工厂模式的应用场景

  • 实现多个产品对象创建行为的一致或者复用就可以使用简单工厂模式,说白了就是通过简单工厂模式来实现单入口,函数内部来实现调用不同的对象或者类。

简单工厂模式实现方式

像简单工厂模式其主要可以参照迪米特原则,让实现的方法或者类对外输出被创建与初始化。

我们的工作中经常会对接多个支付平台,然后需要去调用支付平台进行下单,每个支付平台就是不同的对象,我们通过一个NewPayPlatform创建对象,返回接口。这样就实现了简单工厂模式。下面我们通过业务中Go语言代码具体来讲解简单工厂模式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import "fmt"

func main() {
 NewPayPlatform("test").CreatePayOrder()
}

// 支付平台的公共接口
type PayPlatformInterface interface {
 //创建支付订单
 CreatePayOrder()
}

type AliPay struct {
}

func (a *AliPay) CreatePayOrder() {
 fmt.Println("CreatePayOrder 支付宝")
}

type WeiXinPay struct {
}

func (a *WeiXinPay) CreatePayOrder() {
 fmt.Println("CreatePayOrder 微信支付")
}

// 简单工厂模式,AliPay 和 WeiXinPay是不同的对象, PayPlatformInterface 是接口
func NewPayPlatform(platform string) PayPlatformInterface {
 switch platform {
 case "alipay":
  return &AliPay{}
 case "weixin":
  return &WeiXinPay{}
 }
 // 默认是调用支付宝
 return &AliPay{}
}

看完Go的简单工厂模式,是不是发现和之前的工厂方法模式很像?工厂方法模式的调用可以不用组装公共方法,两种侧重点不一样的,工厂方法模式是侧重定义一批方法,简单工厂模式是侧重调用。

Go的抽象工厂模式

业界抽象工厂模式定义:为创建一组相关或者相互依赖的对象提供一个接口,而无需指定它们的具体类。抽象工厂模式可以说是是工厂方法模式的升级版,当需要创建的产品有多个产品线(产品族)时使用抽象工厂模式是比较好的选择。

抽象工厂模式优缺点

  • 优点
    • 类的创建实例过程与客户端分离,客户端通过工厂的抽象接口操纵实例,客户端并不知道具体的实现是谁。
  • 缺点
    • 如果增加新的产品族则也需要修改抽象工厂和所有的具体工厂。

抽象工厂模式的应用场景:当需要创建的对象是一系列相互关联或相互依赖的产品族时,便可以使用抽象工厂模式,主要是让产品簇实现软件的可配置性。

抽象工厂模式实现方式

在Go的设计模式第一篇工厂方法模式里面我们讲了不同厂商的调用,把公共的方法封装成一批方法组,我们还是上一次的例子做一下升级来讲解一下抽象工厂模式。

我们在做聚合广告需要拉取facebook的数据,facebook当成一个工厂,facebook是auth 1.0授权是这个工厂方法,头条当成一个工厂,头条auth 2.0授权是这个工厂的方法。我们再建一个接口组合两个工厂的方法。下面我们具体看下Go的示例如何实现抽象工厂。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import "fmt"

func main() {
 a := AuthFactory{}
 a.produceAuth1("fb").auth1()
}

type Auth1 interface {
 auth1()
}

// facebook 用auth1授权
type FaceBookAuth struct {
}

func (f *FaceBookAuth) auth1() {
 fmt.Println("facebook auth1")
}

type Auth2 interface {
 auth2()
}

// toutiao 用auth2授权
type TouTiaoAuth struct {
}

func (t *TouTiaoAuth) auth2() {
 fmt.Println("toutiao auth2")
}

// 抽象公共调用
type AbstractFactory interface {
 produceAuth1(firm string) Auth1
 produceAuth2(firm string) Auth2
}

type AuthFactory struct {
}

func (a *AuthFactory) produceAuth1(firm string) Auth1 {
 switch firm {
 case "fb":
  return &FaceBookAuth{}
 }
 return nil
}

func (a *AuthFactory) produceAuth2(firm string) Auth2 {
 switch firm {
 case "toutiao":
  return &TouTiaoAuth{}
 }
 return nil
}

分享完工厂模式(对工厂方法模式不了解的可以查看上一篇文章:【建议收藏】如何用Go写出优美的代码-Go的设计模式【单例模式,工厂方法模式】篇一),简单工厂模式,抽象工厂模式,我们这里做一下总结。

  • 无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,简单工厂模式和工厂方法模式在Go语言实现中可以结合一起使用,只是两个模式侧重点不一样,因为Go里面实现方法就是继承,没办法像Java一样拆得那么细。抽象工厂模式主要是抽象方法中聚集一堆产品方法,主要是让调用更加方便,但在Go语言中,没有抽象方法,只能通过接口实现,通过接口实现还是需要一个对象实现接口里面的方法,这样抽象工厂在Go语言中实现就显得有点累赘了。
  • 工厂模式最终的目的是为了解耦。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 利志分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Docker 搭建开源强大的邮局,poste.io
重要:要部署自己的邮局,请先确认服务器的25端口是开放的,入站出站都是OK的才行,阿里云腾讯云的服务器25端口默认都是封的。不太好解封。所以要试玩搭建poste.io 最好用一个国外的机器
huolong
2023/09/13
9.3K0
Docker 搭建开源强大的邮局,poste.io
使用Docker搭建poste,自建邮件服务器
自建邮件服务可以不受发件量限制,批量发件成本更低,但部署相对复杂,而且容易进垃圾箱。不过现在越来越多的服务商已经开发好了产品,支持一键部署等方式,极大降低了部署和使用难度。这次给各位小伙伴安利一款开源邮件服务poste.
星哥玩云
2022/08/13
7.6K0
使用Docker搭建poste,自建邮件服务器
iRedMail -开源邮件服务器解决方案
huolong
2024/01/11
1.4K0
自建邮局poste.io踩坑填坑(文末有彩蛋)
要自建邮局,要有web管理界面,要原生支持docker,还不能占用太多的资源,挑来挑去,就剩下这款poste.io能用了。
若海
2023/07/05
7.9K1
[叶子]在自己的服务器上搭建自己的邮箱
这可能是我写的文章中为数不多的有全程完整截图的、不是在完工后再来回忆的文章,但并不是因为我一开始就打算写这篇教程,而是搭建邮箱这玩意我做了”双份“——先在我自己的服务器上面给我自己搭建,确认成功了、各项功能都正常了我才在 @gaoice 的服务器上面搭建,并同时边搭建边截图,之所以我写这个,是因为我在给自己的服务器搭建的时候走了太多的弯路,过程太曲折,以至于在完工之后我觉得有必要写这么一篇文章来记录这个过程。但是我并不打算在这篇文章里面详细讲我走的弯路的具体情况,这篇文章主要还是讲搭建这件事本身。
冰漪叶
2022/10/24
10.5K0
[叶子]在自己的服务器上搭建自己的邮箱
邮局系列教程 | Racknerd开启rDNS(PTR反向解析) | 小白向教程
RackNerd的服务器价格便宜,而且开放所有端口(包括25端口),所以非常适合用来搭建自己的邮局系统。这篇文章夜梦将介绍如何在RackNerd服务器上开启rDNS(PTR反向解析),这是搭建邮局的重要一步。相信通过这篇教程,你一定可以轻松地完成rDNS的配置的~
夜梦星尘
2024/08/20
8970
邮局系列教程 | Racknerd开启rDNS(PTR反向解析) | 小白向教程
Docker搭建免费邮箱服务器
EwoMail是基于Linux的开源邮件服务器,支持一键搭建,集成了众多优秀稳定的组件,是一个快速部署、简单高效、安全稳定的邮件解决方案,支持电脑和手机的客户端,适合个人或邮箱功能需求少的企业。
Petrochor
2022/06/07
4.2K0
Docker搭建免费邮箱服务器
【宝塔邮局管理器】使用教程
安装完Redis服务后设置密码,设置密码时不要使用&%这类特殊符号 会导致负载状态显示异常,可使用英文+数字组合密码
西里国际站
2023/04/19
3.4K0
【宝塔邮局管理器】使用教程
Pmail——仅用一分钟就可以搭建好一个邮箱服务器
作者的github地址如下:https://github.com/Jinnrry/PMail readme里有明确说 PMail是一个追求极简部署流程、极致资源占用的个人域名邮箱服务器。单文件运行,包含完整的收发邮件服务和Web端邮件管理功能。只需一台服务器、一个域名、一行代码、一分钟部署时间,你就能够搭建出一个自己的域名邮箱。
huolong
2023/10/26
23.4K11
Pmail——仅用一分钟就可以搭建好一个邮箱服务器
企业邮件安全防护实践
邮件系统作为一种有效的内外部工作沟通平台,在企业内得到广泛使用。同时,广告邮件、垃圾邮件、钓鱼邮件等问题就成了企业邮件安全头号难题。所以我们的企业安全人员以往更多关注反垃圾邮件,向对数据保密,反钓鱼方向演进。
FB客服
2019/10/24
3.8K0
企业邮件安全防护实践
一封伪造邮件引发的“探索”(涉及钓鱼邮件、SPF和DKIM等)
0x00. 引言 我用swaks 发送一封以我们公司CTO为显示发件人(腾讯企业邮箱)的伪造邮件给我的一个同事,邮件的内容就是让这位同事去CTO的办公司一趟,没想到这位同事真的去了,然后一脸懵逼的回来了。 恶作剧算是完了,但是这让我开始研究伪造邮件是为什么产生的,腾讯企业邮为什么没有拦截。 0x01. 关于伪造邮件的一些总结 1) 邮件服务商之间转发邮件是不需要认证的,也就是说MTA 到MTA之间转发邮件是不需要认证的,这是SMTP协议本身定义的。 所以协议钓鱼邮件就可以伪称来自某某MTA发送钓鱼邮件;
FB客服
2018/02/28
6.4K0
一封伪造邮件引发的“探索”(涉及钓鱼邮件、SPF和DKIM等)
Swaks伪造邮件发件人绕过SPF
设置正确的 SPF 记录可以提高邮件系统发送外域邮件的成功率,也可以一定程度上防止别人假冒你的域名发邮件。
黑白天安全
2020/07/23
7.6K0
Swaks伪造邮件发件人绕过SPF
Linux搭建开源企业邮箱系统EwoMail
EwoMail是基于Linux的开源邮件服务器软件,集成了众多优秀稳定的组件,是一个快速部署、简单高效、多语言、安全稳定的邮件解决方案,帮助你提升运维效率,降低 IT 成本,兼容主流的邮件客户端,同时支持电脑和手机邮件客户端。
星哥玩云
2022/09/15
7.5K0
Linux搭建开源企业邮箱系统EwoMail
轻量折腾计划1,搭一个域名邮箱来玩玩
这是一个系列,初期预计将有9-10篇左右的文章,旨在记录我折腾腾讯云的轻量应用服务器的相关过程,欢迎感兴趣的读者关注。
NNT
2021/07/22
4.5K1
轻量折腾计划1,搭一个域名邮箱来玩玩
Docker搭建免费邮箱服务器
EwoMail是基于Linux的开源邮件服务器,支持一键搭建,集成了众多优秀稳定的组件,是一个快速部署、简单高效、安全稳定的邮件解决方案,支持电脑和手机的客户端,适合个人或邮箱功能需求少的企业。
子润先生
2021/06/23
40.2K1
CS学习笔记 | 25、邮件防御
Cobalt Strike 不是什么工作情况都能胜任的工具,因此就需要我们根据不同的情况去做一些辅助工作。
TeamsSix
2020/10/10
1.1K0
关于钓鱼邮件的学习笔记
所以事前我们需要准备一个钓鱼网站,为了能让钓鱼网站在公网访问,还需要一个VPS,若想获得更好的伪装效果,还需要一个用于伪装的域名。VPS和域名都到手后,还可以搭建属于自己的邮服用于SMTPRelay。使用恶意附件的话,还需要准备一个恶意样本,能做免杀的话就更好了,接收shell的话,同样需要一个VPS。
FB客服
2020/03/24
3K0
关于钓鱼邮件的学习笔记
电子邮件伪造
电子邮件伪造是指发送者故意篡改邮件头部信息,以使邮件看起来似乎是来自另一个人或组织的行为。这种行为可能用于欺骗、诈骗、垃圾邮件发送等目的。以下是一些常见的电子邮件伪造技术。
zy010101
2024/05/25
1.1K0
电子邮件伪造
SPF、DKIM与DMARC:电子邮件认证技术详解与优化
随着互联网的普及,电子邮件作为核心沟通工具,其安全性日益重要。垃圾邮件、钓鱼邮件和邮件欺诈行为频发,SPF(Sender Policy Framework)、DKIM(DomainKeys Identified Mail)和DMARC(Domain-based Message Authentication, Reporting & Conformance)成为保障邮件安全的关键技术。本文深入解析其原理、应用及最佳实践,并添加签名事例和格式记录示例,以提升文章的实用性和可操作性。
TurboEx技术分享
2025/07/11
2660
SPF、DKIM与DMARC:电子邮件认证技术详解与优化
他居然发邮件请我去吃饭——邮件伪造那些事儿
今天中午吃午饭的时候,突然收到一封邮件,我一看,不得了啊,居然是美国前总统给我发来的邮件,还说要我助他一臂之力成为新总统。下午再看他的新闻,感觉他现在都自身难保了,怎么会请我吃饭呢?于是怀疑这封邮件是伪造的…
Regan Yue
2022/09/20
1.4K0
他居然发邮件请我去吃饭——邮件伪造那些事儿
推荐阅读
相关推荐
Docker 搭建开源强大的邮局,poste.io
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档