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

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

作者头像
公众号-利志分享
发布于 2022-06-13 07:30:11
发布于 2022-06-13 07:30:11
60700
代码可运行
举报
文章被收录于专栏:利志分享利志分享
运行总次数: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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
设计模式学习笔记(三)简单工厂、工厂方法和抽象工厂之间的区别
设计模式中的工厂模式(Factory Design pattern)是一个比较常用的创建型设计模式,其中可以细分为三种:简单工厂(Simple Factory)、工厂方法(Factory Method)和抽象工厂(Abstract Factory)。那么三者有什么区别呢?先说结论:
归思君
2023/10/16
3.9K0
设计模式学习笔记(三)简单工厂、工厂方法和抽象工厂之间的区别
【Java设计模式】007-简单工厂模式
简单讲:工厂模式就是工厂负责创建对象,使用者不关心对象的创建过程;简单工厂模式就是定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类或实现了共同的接口!
訾博ZiBo
2025/01/06
1360
设计模式专题(十一)——抽象工厂模式
设计模式专题(十一)——抽象工厂模式 (原创内容,转载请注明来源,谢谢) 一、概述 抽象工厂模式(AbstractFactory),提供创建一系列相关或者相互依赖的接口,不需要指定他们具体的类。 抽象工厂模式是在工厂方法模式的基础上,将工厂类进行扩充,当有多种不同的工厂,且每个工厂都有很多的子工厂时,就可以使用此模式。在工厂抽象类的基础上,根据不同的工厂建多个抽象类,这样当需要切换工厂时,只需要切换抽象类的声明即可。 二、特点 1、便于交换产品 一个应用中,只需要在初始化的时候出现一次,使得改变一个工厂
用户1327360
2018/03/07
7540
设计模式专题(十一)——抽象工厂模式
go设计模式之抽象工厂模式
工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销。此时,我们可以考虑将一些相关的产品组成一个“产品族”,由同一个工厂来统一生产
melodyshu
2024/04/26
1431
Java设计模式:工厂模式之简单工厂、工厂方法、抽象工厂(三)
在软件设计中,工厂模式是一种常见的设计模式,它提供了一种创建对象的最佳方式。通过工厂模式,我们可以将对象的创建逻辑与使用逻辑分离,降低代码的耦合度,提高系统的可扩展性和可维护性。
公众号:码到三十五
2024/03/19
2180
设计模式之抽象工厂模式
抽象工厂模式(Abstract Factory),是23种设计模式之一。DP中是这么定义抽象工厂模式的:
端碗吹水
2020/09/23
5130
设计模式之抽象工厂模式
简单工厂模式、工厂模式、抽象工厂模式比较
设计模式已经经历了很长一段时间的发展,它们提供了软件开发过程中面临的一般问题的最佳解决方案。学习这些模式有助于经验不足的开发人员通过一种简单快捷的方式来学习软件设计。
良知犹存
2021/03/06
1.1K0
简单工厂模式、工厂模式、抽象工厂模式比较
23种设计模式之工厂三兄弟
关于设计模式,是一个永远说不完的也说不清的话题。毕竟在编程的世界里,没有最好的设计模式,只有最合适的设计模式。甚至有些时候,程序或者问题不到一定的规模,尝试所有的设计模式都是花架子。另外,在程序设计之初就谈论设计模式有些为时过早,但在问题出现之后才想起来设计模式却有为时已晚,毕竟后期代码的重构或者逻辑的优化都不是一件轻轻松松就能完成的事情。所以,在合适的地方在合适的时机使用合适的设计模式,恰好能体现出来一个开发者的优秀程度。 设计模式就像是武功的套路,每一个套路都有固定的招式。而每一个套路也不是万能的,不同的套路解决不同的问题。初学武功的人,只能以模仿的方式一招一式的练习,而大师级别的武术宗师心中却不受这些套路的桎梏。长时间的习武,反反复复的练习,早就把这些套路深深的印在了骨子里。必要的时候,就能不经思考的下意识出招。同理,深刻理解并经常应用设计模式的开发者,遇到问题的时候,可以熟练的筛选出来合适的设计模式。甚至有些时候,他们还可以把这些设计模式进行组合或者进行一些改造,来达到更好的效果,无招胜有招,心中无模式却胜过有模式,这大概就是设计模式的最高境界。
VV木公子
2018/08/13
7.1K0
23种设计模式之工厂三兄弟
【Java设计模式】009-抽象工厂模式
简单讲:抽象工厂定义创建的多个产品,具体工厂负责创建,每个具体工厂负责一个品牌的产品的创建,使用者根据具体工厂和产品名称获得产品;
訾博ZiBo
2025/01/06
1240
设计模式之工厂模式-抽象工厂模式
2:如果我们把对象实例化代码进行抽象,抽象成创建对象的方法跟具体的实例化(也就是其子类),这种就是工厂方法模式。工厂方法模式的意义:将对象的创建过程,由原来的在类里面创建延迟到子类里面来创建对象了。
凯哥Java
2019/08/28
4370
设计模式之工厂模式-抽象工厂模式
抽象工厂模式(选择产品簇)
对简单工厂模式还不了解的可以查看下我的历史文章 简单工厂模式,简单工厂模式的核心是使用工厂实现选择创建产品实现,这应该很好理解。
幺鹿
2018/08/21
1K0
抽象工厂模式(选择产品簇)
JAVA设计模式之抽象工厂模式
前面已经介绍过简单工厂模式和工厂方法模式,这里继续介绍第三种工厂模式-抽象工厂模式,还是以汽车的制造为例。
秃头哥编程
2019/06/05
4360
JAVA设计模式之抽象工厂模式
[设计模式]简单工厂模式
该文讲述了如何利用简单工厂模式实现具有加减乘除功能的计算器,并介绍了简单工厂模式的结构、特点和优缺点,以及测试代码和运行结果。
静默虚空
2018/01/05
5220
[设计模式]简单工厂模式
创建型设计模式(4)—— 抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式(Abstract Factory Pattern)属于创建型模式,为创建一组相关或者相互依赖的对象(产品族)提供一个抽象类接口,而无需指定它们的具体类。 产品族的定义是:某个具体工厂生产所有类型的产品,比如定义了一个抽象工厂接口 A,它可以生产三种产品:p1、p2、p3,而这三个产品就叫一个产品族。
恋喵大鲤鱼
2024/05/24
1300
创建型设计模式(4)—— 抽象工厂模式(Abstract Factory Pattern)
Java设计模式之工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)
在java中,创建一个对象最简单的方法就是使用new关键字。但在一些复杂的业务逻辑中,创建一个对象不只需要new一行代码就成了,可能需要一些列的初始化设置,或先创建一些辅助对象来创建这个对象。
用户2409797
2018/08/30
7090
[C#]设计模式 之 工厂模式
工厂类包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类。对于客户端来说,去除了对具体产品的依赖。 不符合【OCP】。
科控物联
2022/03/29
3050
[C#]设计模式 之 工厂模式
设计模式之 工厂模式
简单工厂模式 : 简单工厂模式是属于创建型的设计模式,又叫做静态工厂方法模式,但不属于23种GOF设计模式,简单工厂模式是由一个工厂决定创建哪一类产品的实例,简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
用户3094376
2018/09/12
5540
设计模式之 工厂模式
抽象工厂模式(Abstract Factory)- 最易懂的设计模式解析
在上文提到的最易懂的设计模式系列解析:工厂方法模式,发现工厂方法模式存在一个严重的问题:
Carson.Ho
2019/02/22
3.6K0
设计模式(6)——抽象工厂模式(Abstract Factory Pattern,创建型)
使用设计模式可以提高代码的可复用性、可扩充性和可维护性。抽象工厂模式(Abstract Factory Pattern)属于创建型模式,为创建一组相关或者相互依赖的对象(产品族)提供一个抽象类接口,而无需指定它们的具体类。。产品族的定义是:某个具体工厂生产的所有类型的产品,比如定义了一个抽象工厂接口A,它可以生产三种产品:p1、p2、p3,而这三个产品就叫一个产品族。
恋喵大鲤鱼
2018/08/03
5080
设计模式(6)——抽象工厂模式(Abstract Factory Pattern,创建型)
简单工厂模式
简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,用于创建对象的实例。通过一个工厂类来决定实例化哪一个具体类,降低客户端与具体类之间的耦合。
码事漫谈
2024/12/20
1040
简单工厂模式
推荐阅读
相关推荐
设计模式学习笔记(三)简单工厂、工厂方法和抽象工厂之间的区别
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档