Go设计模式-抽象工厂模式

今天整理下学习的 Go设计模式-抽象工厂的笔记, 后续复习使用.

参考地址:
https://blog.csdn.net/qq_42956653/article/details/120456713
https://www.jianshu.com/p/ca429ce8612f

抽象工厂模式最大的特征就是定义中提到的“相关或相互依赖的对象”,通俗点说,就是抽象工厂模式相比工厂模式多了两个概念:“产品族”和“等级结构”。工厂模式中的每个工厂只能生产一种产品,而抽象工厂模式将某些相关、等级结构不同的产品组成了一个“产品族”,然后用一个工厂来统一生产。

可以举一个例子,更好的理解。

我们可以把Web应用简单地看做是由前端(客户端)和后端(服务端)组成的,不知道在看我的文章的同学中有没有知道“前端架构师”这个职业的同学,我们一直以为做后端开发更容易成为架构师,但是当前端变得越来越复杂时,前端架构师这种职位也就产生了。所以,在这个例子中,我们把架构师分为“前端架构师”和“后端架构师”两类。当然,要开发一个完整的Web应用,光有架构师还不行,还得有程序员来把架构师给出的设计用代码实现,而我们都知道程序员有做前端开发的,也有做后端开发的,这样也可以把程序员分为“前端程序员”和“后端程序员”两类。

在这个场景中,我们有四种产品:前端程序员、前端架构师、后端程序员、后端架构师。我们可以把“前端”和“后端”分为两个不同的等级结构,我们可以为这两个等级结构创建两个工厂类FrontEndFactory和BackEndFactory,我们同时也可以把“程序员”和“架构师”分为另外两个不同的产品族,在每个工厂类里添加CreateProgrammer()和CreateArchitect()两个方法用于创建程序员和架构师的实例——也就是说,有多少个产品族,在抽象工厂类里就有多少个创建方法。

根据这个场景我们可以画出下面这张UML类图(稍微有点不太标准,不过能通过这张图把上面描述的场景搞懂就OK了):

image.png

代码来实现:


package main

import "fmt"

// Programmer 程序员总称
type Programmer interface {
    Work() // 程序员都会工作
}

// Architect 架构师总称
type Architect interface {
    Design() // 架构师都会做架构设计
}

// FrontEndArchitect 前端架构师
type FrontEndArchitect struct{}

func (a *FrontEndArchitect) Design() {
    fmt.Println("前端架构师做了一个页面秒开的设计")
}

// FrontEndProgrammer 前端程序员
type FrontEndProgrammer struct{}

func (p *FrontEndProgrammer) Work() {
    fmt.Println("前端程序员在用WebStorm写TypeScript代码")
}

// BackEndArchitect 后端架构师
type BackEndArchitect struct{}

func (a *BackEndArchitect) Design() {
    fmt.Println("后端架构师做了一个可以抗住上万并发的设计")
}

// BackEndProgrammer 后端程序员
type BackEndProgrammer struct{}

func (p *BackEndProgrammer) Work() {
    fmt.Println("后端程序员在用GoLand写Golang代码")
}

// AbstractFactory 抽象工厂
type AbstractFactory interface {
    CreateProgrammer() Programmer // 创建程序员
    CreateArchitect() Architect   // 创建架构师
}

// FrontEndFactory 前端工厂
type FrontEndFactory struct{}

func (f *FrontEndFactory) CreateProgrammer() Programmer {
    return &FrontEndProgrammer{}
}

func (f *FrontEndFactory) CreateArchitect() Architect {
    return &FrontEndArchitect{}
}

// BackEndFactory 后端工厂
type BackEndFactory struct{}

func (f *BackEndFactory) CreateProgrammer() Programmer {
    return &BackEndProgrammer{}
}

func (f *BackEndFactory) CreateArchitect() Architect {
    return &BackEndArchitect{}
}

func main() {
    ff := FrontEndFactory{}     // 定义前端工厂
    fa := ff.CreateArchitect()  // 定义前端架构师类
    fp := ff.CreateProgrammer() // 定义前端程序员类
    fmt.Println("前端组接到任务,开始工作...")
    fa.Design() // 架构师开始工作
    fp.Work()   // 程序员开始工作
    fmt.Println("后端组招到了一个程序员和一个架构师")
    bf := BackEndFactory{}
    ba := bf.CreateArchitect()
    bp := bf.CreateProgrammer()
    fmt.Println("后端组接到任务,开始工作...")
    ba.Design()
    bp.Work()

}


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容