赠书!想学 Go 语言设计模式,得看他这本

Go语言入门书籍推荐(10本) Go 入门指南》由中文社区 Go 中文网编写,内容涵盖了 Go 语言基础、控制流程、数组和切片、函数和指针、结构体和方法等方面的内容。《Go 语言编程》是由图灵教育编写的一本入门教程,全书共分为 18 章,包括 Go 语言基础、流程控制、函数、数组切片、指针、结构体和面向对象编程等内容。《Go 语言核心编程》是由 Go 语言爱好者张开涛编写出版的书籍,全书分为 14 章,涵盖了 Go 语言的以下方面:基础语法、函数、数组和切片、类型和接口、并发编程和Web开发等。1.Go 语言编程》 阅读详情

最近出了一本新书《Go语言设计模式》,我赶紧拉上我们的老相好出版社给大家赠书,都学起设计模式。

赠送规则:老规矩,留言聊聊你了解的设计模式(留言太随意,中奖概率会降低),根据点赞数取前 10 位,同时结合过往对本公众号的支持(留言、转发、点赞、在看等),从中选出 5 位送出

开奖时间:2023年03月28日09点。

以下是这本书的其中一节。


01

为什么需要设计模式

设计模式可以根据以前的实践和经验记录要采用的解决方案。

在设计模式的实现过程中,需要使用多个软件组件共同实现某些功能。

因此,设计模式加快了涉及多个组件的开发过程。

开发者可以在对应解决方案的具体应用中使用熟悉的编程语言。

例如,如果某个开发者熟悉Go语言,那么这个开发者可以使用Go语言开发相应的组件。

  • 使用设计模式可以提高开发速度。设计模式提供了经过验证的开发范例,有助于节省时间,而不必在每次出现问题时都重新创建设计模式。

  • 因为设计模式是为了修复已知问题而创建的,所以设计模式可以在软件开发过程中对其进行预测。

  • 使用设计模式可以提高开发者的思维能力、编程能力和设计能力。

  • 设计模式使程序设计更加标准化、代码编制更加工程化,从而提高软件的开发效率,缩短软件的开发周期。

  • 使用设计模式设计的代码可重用性高、可读性强、可靠性高、灵活性好、可维护性强。设计模式可以在多种情况下以具体方式使用,可以让系统在后期更容易维护和扩展。

02

实战示例
1)什么是工厂方法模式

工厂方法模式(Factory Method Pattern)定义了一个用于创建对象的接口,但让子类决定实例化哪个类。

接口中的工厂方法允许类将实例化操作推迟到一个或多个具体子类中。

工厂方法模式是创建对象的最佳方法之一,其中的对象创建逻辑对客户端隐藏。

工厂方法模式的UML类图如下图所示。

f5726bbccf1805e225c1af2820c85ed5.png

根据上图可知,工厂方法模式的角色组成如下。

  • 工厂(Factory):声明返回产品对象的工厂方法的接口。该方法返回的对象类型必须与产品接口类型相匹配。

  • 具体工厂(ConcreteFactory):实现工厂接口的类,会重写基础工厂方法,使其返回不同类型的产品。

  • 产品(Product):声明产品方法的接口。对于所有由具体工厂类及其子类构建的对象,该接口是通用的。

  • 具体产品(ConcreteProduct):实现产品接口的类。


2)工厂方法模式的使用场景
  • 在程序开发过程中,如果开发者无法预知对象的具体类型及其依赖关系,则可以使用工厂方法模式。工厂方法模式将创建产品的工厂代码与产品代码分离,从而降低代码之间的耦合度。例如,如果需要添加一种新产品,则只需创建一个新的具体工厂类,然后重写其工厂方法。

  • 如果开发者希望其他开发者可以扩展软件库或框架的内部组件,则可以使用工厂方法模式。

  • 如果一个类需要通过子类指定其创建的对象,则可以使用工厂方法模式。

3)工厂方法模式的实现方式

(1)定义工厂接口。

在工厂方法模式中,会在工厂接口中声明对所有产品都有意义的方法,示例代码如下:

//工厂接口
type Factory interface {
    FactoryMethod(owner string) Product
}

(2)定义具体工厂类,并且实现工厂接口中的方法。

示例代码如下:

//具体工厂类
type ConcreteFactory struct {




}




//具体工厂类的工厂方法
func (cf *ConcreteFactory) FactoryMethod(owner string) Product {
    p := &ConcreteProduct{}
    return p
}

在具体工厂类的工厂方法中调用具体产品对象,并且返回具体产品对象。开发者可能需要在工厂方法中添加临时参数,用于控制返回的具体产品对象的类型。

(3)定义产品接口,并且定义该接口中的方法签名。

示例代码如下:

//产品接口
type Product interface {
    Use()
}

(4)定义具体产品类,并且实现产品接口中的方法。

示例代码如下:

//具体产品类
type ConcreteProduct struct {
} 




//具体产品类的方法
func (p *ConcreteProduct) Use()  {
    fmt.Println("This is a concrete product")
}

(5)创建客户端,使用工厂生产产品。

示例代码如下:

package main




import (
    "github.com/shirdonl/goDesignPattern/chapter2/factory/example"
)




func main() {
    //声明具体工厂对象
    factory := example.ConcreteFactory{}




    //生产产品
    product := factory.FactoryMethod("shirdon")
    //使用产品
    product.Use()
}
//$ go run main.go
//This is a concrete product

4)Go语言实战

假设开发者正在开发一款服装工厂的品牌管理应用程序。

该应用程序的最初版本只能生产一种品牌ANTA的服装,因此大部分代码都在位于名为ANTA的类中。在一段时间后,工厂生产的这个品牌的服装质量很好,销量很高。工厂收到了很多其他公司的合作请求,希望工厂能够生产其他品牌的服装。

在应用程序中新增一个品牌类会遇到问题。如果其他代码与现有的类已经存在耦合关系,那么向应用程序中添加新类会比较麻烦。

目前,大部分代码都与ANTA类有关。如果要在应用程序中添加新的品牌类PEAK,则需要修改之前编写的大部分代码。

此外,如果开发者以后需要在程序中添加其他品牌类,则需要再次对代码进行大规模修改。

使用工厂方法模式可以解决上面的问题。工厂方法模式建议使用特殊的工厂方法调用对象,工厂方法返回的对象通常称为产品。

在工厂方法模式中,开发者可以在子类中重写工厂方法,从而改变其创建的产品类型。

工厂方法模式的UML类图如下图所示。

2aba6f5f8011968a7b6b4f235b626e2f.png

所有产品都必须实现同一个接口。例如,PEAK类和ANTA类都必须实现服装产品接口IClothes,该接口中声明了方法GetName()和GetSize()。只要产品类实现一个共同的产品接口,开发者就可以将其对象传递给客户端,不需要提供其他数据。

客户端不需要了解不同子类返回的对象之间的差别。客户端将所有产品视为抽象的服装产品接口IClothes。客户端知道所有服装品牌对象都有其相应的方法,无须关心服装品牌对象的具体实现方式。

由于Go语言中缺少类和继承等面向对象编程的特性,因此无法使用Go语言实现经典的工厂方法模式。不过,开发者仍然可以实现工厂方法模式的基础版本,即简单工厂。在本实战中,开发者会使用服装工厂类生产多种品牌的服装。

首先,创建一个名为IClothes的接口,在该接口中定义生产一套服装所需的所有方法;然后,创建实现IClothes接口的服装产品类clothes。

有两种具体的服装产品类,分别是ANTA类与PEAK类,二者都嵌入了clothes类,并且间接实现了IClothes接口中的所有方法。

服装工厂类ClothesFactory会发挥工厂的作用,即通过传入参数生产所需类型的服装。main.go文件会扮演客户端的角色,它不会直接与ANTA类或PEAK类进行互动,而是依靠ClothesFactory类创建多种服装产品对象,仅使用字符参数控制生产。

(1)定义服装产品接口IClothes,该接口中有两个私有方法——setName()和setSize(),以及两个公共方法——GetName()和GetSize(),代码如下:

type IClothes interface {
    setName(name string)
    setSize(size int)
    GetName() string
    GetSize() int
}

(2)定义服装产品类clothes及其方法,该类会被嵌套进PEAK、ANTA等具体品牌类,代码如下:

type clothes struct {
    name  string
    size int
}




func (c *clothes) setName(name string) {
    c.name = name
}




func (c *clothes) GetName() string {
    return c.name
}




func (c *clothes) setSize(size int) {
    c.size = size
}




func (c *clothes) GetSize() int {
    return c.size
}

(3)定义具体服装产品类PEAK及其初始化函数,代码如下:

type PEAK struct {
    clothes
}




func newPEAK() IClothes {
    return &PEAK{
        clothes: clothes{
            name:  "PEAK clothes",
            size: 1,
        },
    }
}

(4)定义具体服装产品类ANTA及其初始化函数,代码如下:

type ANTA struct {
    clothes
}




func newANTA() IClothes {
    return &ANTA{
        clothes: clothes{
            name:  "ANTA clothes",
            size: 4,
        },
    }
}

(5)编写MakeClothes()函数,该函数会根据实参类型生产不同品牌的服装,代码如下:

func MakeClothes(clothesType string) (IClothes, error) {
    if clothesType == "ANTA" {
        return newANTA(), nil
    }
    if clothesType == "PEAK" {
        return newPEAK(), nil
    }
    return nil, fmt.Errorf("Wrong clothes type passed")
}

(6)创建客户端,测试工厂方法模式,代码如下:

func main() {
    ANTA, _ := pkg.MakeClothes("ANTA")
    PEAK, _ := pkg.MakeClothes("PEAK")




    printDetails(ANTA)
    printDetails(PEAK)
}




func printDetails(c pkg.IClothes) {
    fmt.Printf("Clothes: %s", c.GetName())
    fmt.Println()
    fmt.Printf("Size: %d", c.GetSize())
    fmt.Println()
}
//$ go run main-actual-combat.go
//Clothes: ANTA clothes
//Size: 4
//Clothes: PEAK clothes
//Size: 1
5)工厂方法模式的优缺点

优点:

  • 应用程序的模块具有可扩展性。在工厂方法模式中,调用一个方法与新类的实现是完全分离的。这种情况对如何扩展软件有特殊的影响:工厂方法具有高度的自治性,开发者在添加新类后,无须以任何方式更改应用程序。

  • 工厂组件具有单独可测试性。例如,如果工厂方法模式实现了3个类,则可以单独测试每个类的功能。

  • 与类的构造函数或初始化函数不同,可以为工厂方法起一个有意义的名称。

缺点:

  • 系统中类的数量会成对增加,从而提高系统的复杂度。工厂设计模式的实现会导致集成类的数量大幅增加,因为每个具体产品类都需要一个具体工厂类。尽管工厂方法模式有利于软件扩展,但会增加工作量。如果要扩展工厂方法模式的产品系列,则必须调整工厂接口及相应的具体工厂类。因此,针对所需产品类型提前进行可靠规划是必不可少的。

  • 抽象层的引入,提高了开发者对系统的理解难度。在客户端代码中需要使用抽象层,提高了系统的抽象性和开发者的理解难度。

d127f7d3b31c9a099d6e22ed3337c734.gif

以上节选自《Go语言设计模式》一书。

本书聚焦于Go语言设计模式的知识与应用。

全书共6章,分别为设计模式入门、创建型设计模式、结构型设计模式、行为型设计模式、设计模式扩展、设计模式与软件架构。

本书简洁而不失技术深度,内容覆盖Go语言的主流设计模式和软件架构,以极简的文字介绍了复杂的案例,是学习Go语言设计模式和软件架构的实用教程。

该书已经出版发行,并给大家申请到五折优惠,感兴趣的读者朋友欢迎直接购买。

52c2c3bf9a684c785472a6269fbda42e.jpeg

9198ace80ac73e466d3c4975c10317bb.jpeg

设计模式(Gof完整版PDF) PDF高清教程 + 23个模式的源码 + lexi 编辑器源码 很好很强大 立即下载

相关推荐

Go设计模式

设计模式设计模式设计模式设计模式设计模式设计模式设计模式设计模式

go语言设计模式

设计模式go语言) 这里写目录标题设计模式go语言)1. 简单工厂模式( Simple Factory Pattern )1.1. 模式动机1.2. 模式定义1.3. 模式结构1.4.代码示例2. 工厂方法模式(Factory Method Pattern)2.1. 模式动机2.2. 模式定义2.3. 模式结构2.4. 代码示例3. 抽象工厂模式(Abstract Factory)3.1. 模式动机3.2. 模式定义3.3. 模式结构3.4. 代码示例4. 建造者模式/生成器模式(Builder Pat

A0AA0aaa的博客 1397

go 设计模式

go 设计模式

GO 语言实现设计模式【全】

文章目录0.前言1.责任链模式概念示例登机过程测试程序运行结果2.命令模式概念示例电饭煲接收器电饭煲命令测试程序运行结果3.迭代器模式概念示例班级成员运行结果4.中介者模式概念示例飞机对象机场塔台测试程序运行结果5.备忘录模式概念示例闯关游戏测试程序运行结果6.观察者模式概念示例通知方式信用卡业务测试程序运行结果7.状态模式概念示例电池状态IPhone手机测试程序运行结果8.策略模式概念示例四季天气城市气候测试程序运行结果9.模板方法模式概念示例演员基类具体演员测试程序运行结果10.访问者模式概念示例员工.

Doublelv 的博客专栏。 3663

【转存】Go语言设计模式(推荐阅读)

Go语言设计与示例模式

艾利克斯冰的博客 2258

2024年推荐 10 本 Go 经典书籍,从入门到进阶(1),2024年最新这些知识你必须拿下

作者许式伟为原金山 WPS 首席架构师、曾是盛大创新院研究员,目前是国内 Go 语言实践圈子公认的 Go 语言专家。参与本书写作的几位作者都是实际用 Go 语言开发的项目的开发人员,有较强的实战经验。

2401_84911322的博客 1160

Go语言进阶推荐这样三本书

编译一个大型的C或者C++项目所花费的时间甚至比去喝杯咖啡的时间还长。图1-1是XKCD中的一幅漫画,描述了在办公室里开小差的经典借口。 图1-1 努力工作?(来自XKCD) Go语言使用了更加智能的编译器,并简化了解决依赖的算法,最终提供了更快的编译速度。编译Go程序时,编译器只会关注那些直接被引用的库,而不是像Java、C和C++那样,要遍历依赖链中所有依赖的库。因此,很多Go程序可以在1秒内编译完。在现代硬件上,编译整个Go语言的源码树只需要20秒。 因为没有从编译代码到执行代码的中间过

人邮异步社区 1849

超赞的GO语言设计模式和成例集锦

原文:Awesome Go Patterns 作者:tmrts 翻译:王嘉怡 责编:仲培艺 Go语言从面世就受到了业界的普遍关注,曾有文章分析,Go是最有可能改变未来IT技术的十大语言之一。本文作者列举了Go语言设计模式和成例合集,并且还进行了详细的分类。创建型模式 抽象工厂模式:提供一个接口用于创建相关对象的家族; Builder模式:使用简单的对象来构建复杂的对象; 工厂方法模式...

Joy0921的博客 3218

自己整理好的go语言设计模式

各类模式的模仿,和通用思想,熟悉编程的人都知道,以GO语言的思想参考

Go入门及进阶书籍推荐

Go入门教程全集 链接: https://pan.baidu.com/s/1mWD7DpRa56WXi7WmNaohOg 提取码: ki1e Cloud.Native.Go.pdf C和指针.pdf C++面向对象多线程编程.pdf Design Pattern In Go[go语言设计模式].pdf Docker —— 从入门到实践 - v1.0.pdf Docker 容器与容器云(第2版).pdf GO语言圣经(1).pdf GO语言圣经.pdf Go 内存模型 - Go 编程语言.pdf Go 学习

码农印象 1807

Go书籍大全-从初级到高级以及Web开发

我使用Go开发已经有一年左右时间了,由于有C开发的经验,从学习到上手大概花费了一周左右的时间,目前主要是利用GoFrame和Gin框架开发一些网关设备上的Web后端以及利用Go写一些流媒体相关的客户端和服务端,但是总感觉少了点什么,个人感觉可能是看的书比较少,对于Go开发掌握的不够,所以这里找了一些书籍,打算看书做更多的项目来实践一下。总的来说,Go开发效率是很高的,很多时候给我的感觉就像在写简化的C,静态链接的方式也避免了编译时大量找依赖库的麻烦。...

逍遥游的博客 3066

Go语言开发必读书目,从菜鸟到大牛必备

Go语言是最近几年流行起来的语言,该语言有谷歌发明,并得到广泛的应用。Go语言最大的特点是并发支持度好,而且开发效率高。在C语言中需要几十行,上百行代码才能实现的功能,在Go语言中可能只需要几行代码就可以搞定。因此,目前很多人开始学习Go语言进行开发Go语言的应用领域也很广,包括服务端的开发,Web开发和应用开发等等。下面本文推荐几本Go语言入门必读的图书。 Go语言程序设计 这本书是Go语言...

shuningzhang的专栏 7221

Go语言并发与并行学习笔记(三)

Go语言并发的设计模式和应用场景 以下设计模式和应用场景来自Google IO上的关于Goroutine的PPT:https://talks.golang.org/2012/concurrency.slide 本文的示例代码在: https://github.com/hit9/Go-patterns-with-channel 生成器 在Python中我们可以使用yield关

kjfcpua的专栏 5609

推荐几本学习Go语言的书

最近有一本《Go语言高级编程》的新书上架了,小编觉着有必要把之前的优秀Go语言书也带大家来回顾一下。 最新上架: Go语言高级编程 作者:柴树杉 曹春晖 一本能满足Gopher好奇心的Go语言进阶读物 汇集了作者多年来学习和使用Go语言的经验 更倾向于描述实现细节,极大地满足开发者的探索欲望 本书作者是国内第一批Go语言实践者和Go语言代码贡献者,创建了Go语言中国讨论组,并组织了早期Go...

人邮异步社区 1万+

大白话说Java设计模式-22-桥接模式(业务实战篇)

本文结合大白商城优惠券多类型×多力度组合的业务场景,详解桥接模式的核心设计思想与实战实现,对比继承爆炸、if-else堆叠等反面方案的痛点,拆解桥接模式的抽象、精确抽象、实现接口、具体实现四大核心角色,提供可直接运行的生产级代码实现,深入分析JDBC DriverManager的桥接应用原理,对比桥接与继承、适配器、装饰器、策略模式的适用场景差异,给出工程决策Checklist与常见避坑指南,帮助开发者掌握如何运用桥接模式解决多维度变化的业务架构问题,降低代码耦合度,提升扩展性。

AI工程硬核派+电脑生活效率咖 343
上一篇: MySQL 的索引为什么使用 B+ 树而不使用跳表?
下一篇: 一分钟搞明白!快速掌握 Go WebAssembly
煎鱼(EDDYCJY)
博客等级 码龄12年 1818粉丝 · 505原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值