• Go 语言 设计模式-抽象工厂模式


    抽象工厂模式

    抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。
    在这里插入图片描述

    抽象工厂定义了用于创建不同产品的接口, 但将实际的创建工作留给了具体工厂类。 每个工厂类型都对应一个特定的产品变体。

    在创建产品时, 客户端代码调用的是工厂对象的构建方法, 而不是直接调用构造函数 (new操作符)。 由于一个工厂对应一种产品变体, 因此它创建的所有产品都可相互兼容。

    客户端代码仅通过其抽象接口与工厂和产品进行交互。 该接口允许同一客户端代码与不同产品进行交互。 你只需创建一个具体工厂类并将其传递给客户端代码即可。

    概念示例

    让我们假设一下, 如果你想要购买一组运动装备, 比如一双鞋与一件衬衫这样由两种不同产品组合而成的套装。 相信你会想去购买同一品牌的商品, 这样商品之间能够互相搭配起来。

    如果我们把这样的行为转换成代码的话, 帮助我们创建此类产品组的工具就是抽象工厂, 便于产品之间能够相互匹配。

    iSportsFactory.go: 抽象工厂接口

    package main
    
    import "fmt"
    
    type ISportsFactory interface {
        makeShoe() IShoe
        makeShirt() IShirt
    }
    
    func GetSportsFactory(brand string) (ISportsFactory, error) {
        if brand == "adidas" {
            return &Adidas{}, nil
        }
    
        if brand == "nike" {
            return &Nike{}, nil
        }
    
        return nil, fmt.Errorf("Wrong brand type passed")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    adidas.go: 具体工厂

    package main
    
    type Adidas struct {
    }
    
    func (a *Adidas) makeShoe() IShoe {
        return &AdidasShoe{
            Shoe: Shoe{
                logo: "adidas",
                size: 14,
            },
        }
    }
    
    func (a *Adidas) makeShirt() IShirt {
        return &AdidasShirt{
            Shirt: Shirt{
                logo: "adidas",
                size: 14,
            },
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    nike.go: 具体工厂

    package main
    
    type Nike struct {
    }
    
    func (n *Nike) makeShoe() IShoe {
        return &NikeShoe{
            Shoe: Shoe{
                logo: "nike",
                size: 14,
            },
        }
    }
    
    func (n *Nike) makeShirt() IShirt {
        return &NikeShirt{
            Shirt: Shirt{
                logo: "nike",
                size: 14,
            },
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    iShoe.go: 抽象产品

    package main
    
    type IShoe interface {
        setLogo(logo string)
        setSize(size int)
        getLogo() string
        getSize() int
    }
    
    type Shoe struct {
        logo string
        size int
    }
    
    func (s *Shoe) setLogo(logo string) {
        s.logo = logo
    }
    
    func (s *Shoe) getLogo() string {
        return s.logo
    }
    
    func (s *Shoe) setSize(size int) {
        s.size = size
    }
    
    func (s *Shoe) getSize() int {
        return s.size
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    adidasShoe.go: 具体产品

    package main
    
    type AdidasShoe struct {
        Shoe
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    nikeShoe.go: 具体产品

    package main
    
    type NikeShoe struct {
        Shoe
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    iShirt.go: 抽象产品

    package main
    
    type IShirt interface {
        setLogo(logo string)
        setSize(size int)
        getLogo() string
        getSize() int
    }
    
    type Shirt struct {
        logo string
        size int
    }
    
    func (s *Shirt) setLogo(logo string) {
        s.logo = logo
    }
    
    func (s *Shirt) getLogo() string {
        return s.logo
    }
    
    func (s *Shirt) setSize(size int) {
        s.size = size
    }
    
    func (s *Shirt) getSize() int {
        return s.size
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    adidasShirt.go: 具体产品

    package main
    
    type AdidasShirt struct {
        Shirt
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    nikeShirt.go: 具体产品

    package main
    
    type NikeShirt struct {
        Shirt
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    main.go: 客户端代码

    package main
    
    import "fmt"
    
    func main() {
        adidasFactory, _ := GetSportsFactory("adidas")
        nikeFactory, _ := GetSportsFactory("nike")
    
        nikeShoe := nikeFactory.makeShoe()
        nikeShirt := nikeFactory.makeShirt()
    
        adidasShoe := adidasFactory.makeShoe()
        adidasShirt := adidasFactory.makeShirt()
    
        printShoeDetails(nikeShoe)
        printShirtDetails(nikeShirt)
    
        printShoeDetails(adidasShoe)
        printShirtDetails(adidasShirt)
    }
    
    func printShoeDetails(s IShoe) {
        fmt.Printf("Logo: %s", s.getLogo())
        fmt.Println()
        fmt.Printf("Size: %d", s.getSize())
        fmt.Println()
    }
    
    func printShirtDetails(s IShirt) {
        fmt.Printf("Logo: %s", s.getLogo())
        fmt.Println()
        fmt.Printf("Size: %d", s.getSize())
        fmt.Println()
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    output.txt: 执行结果

    Logo: nike
    Size: 14
    Logo: nike
    Size: 14
    Logo: adidas
    Size: 14
    Logo: adidas
    Size: 14
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    [李宏毅老师深度学习视频] BERT介绍
    v-for列表渲染
    链表的常见数据结构及题目
    基于百度文心大模型全面重构,小度正式推出AI原生操作系统DuerOS X
    【活动】CSDN诚邀您参与回归创作
    我的电子萝卜刀火了吗?
    Git 传文件到github
    070:mapboxGL加载含有shp文件的zip,显示图形
    Pandas+Pyecharts | 上海市餐饮数据分析可视化
    OpenCV17-图像形态学操作
  • 原文地址:https://blog.csdn.net/weixin_43064185/article/details/126847391