Golang 设计模式:抽象工厂模式

使用 Golang 实现抽象工厂模式

抽象工厂模式介绍

抽象工厂模式是一种创建型设计模式,旨在提供一个接口用于创建一系列相关或依赖对象,而无需指定其具体类。

产品等级概念

产品等级是指一组具有相似用途或属于同一类别的产品集合。这些产品在功能和用途上有一定的相似性,但不一定有直接的关联。

在电器设备中,不同品牌的空调(比如 格力、美的)构成一个产品等级。它们都属于空调这个大类别,但品牌之间可能有很多差异。

产品族概念

产品族是指一组在某种维度上相关联的产品集合。这些产品之间通常有一定的关联性,可以一起使用,形成一个完整的解决方案。

在同一品牌的产品等级中,不同类型的电器(比如空调、电视机)构成一个产品族。它们之间存在关联性,属于同一品牌的整体产品组合。

需求

当用户需要的家电必须是同一品牌,不想是格力电视和美的空调;并且当你需要在添加新的品牌、新的家电时,不想修改已有代码时,符合开闭原则,可通过抽象工厂模式实现。

特点

抽象工厂模式具有以下特点:

  1. 产品族一致性: 抽象工厂模式确保创建的产品属于同一产品族,即产品之间有一定的关联性。这有助于确保产品的一致性,使它们能够协同工作。
  2. 工厂切换灵活性: 通过使用抽象工厂模式,客户端代码可以轻松地切换不同的工厂,以便创建不同产品族的对象。这使得系统更加灵活,能够适应不同的需求和变化。
  3. 系统扩展性: 当需要引入新的产品族时,只需添加新的具体工厂和产品类,而无需修改已有的代码。这有助于系统的扩展,同时保持对已有功能的稳定性。
  4. 符合开闭原则: 抽象工厂模式符合开闭原则,即对扩展开放,对修改关闭。通过添加新的具体工厂和产品,可以扩展系统的功能,而不会影响到已有的代码。
  5. 降低客户端与产品类的耦合度: 客户端代码通过抽象工厂接口与具体产品类解耦,客户端不需要知道具体产品的实现细节,只需关心抽象工厂接口和产品的一致性。
  6. 适用于复杂对象构建: 抽象工厂模式适用于需要构建一整个产品族,且这些产品族之间存在关联性的场景。它能够提供一种有组织的方式来创建和管理相关对象。

代码示例说明

以下是一个简单的 Golang 代码示例,以上述的家电为例子,演示了抽象工厂模式:

go 复制代码
package main

import "fmt"

// Appliance 表示家电的基本属性
type Appliance struct {
    brand string
}

// IAppliance 定义家电的行为接口
type IAppliance interface {
    Operate()
}

// TV 表示电视
type TV struct {
    Appliance
}

func (t *TV) Operate() {
    fmt.Printf("%s电视正在播放节目\n", t.brand)
}

// AirConditioner 表示空调
type AirConditioner struct {
    Appliance
}

func (ac *AirConditioner) Operate() {
    fmt.Printf("%s空调正在调整温度\n", ac.brand)
}

// AbstractFactory 定义创建家电的抽象工厂接口
type AbstractFactory interface {
    CreateTV() IAppliance
    CreateAirConditioner() IAppliance
}

// GreeFactory 格力品牌的家电工厂
type GreeFactory struct {
}

func (gf *GreeFactory) CreateTV() IAppliance {
    return &TV{Appliance: Appliance{brand: "格力"}}
}

func (gf *GreeFactory) CreateAirConditioner() IAppliance {
    return &AirConditioner{Appliance: Appliance{brand: "格力"}}
}

// MideaFactory 美的品牌的家电工厂
type MideaFactory struct {
}

func (mf *MideaFactory) CreateTV() IAppliance {
    return &TV{Appliance: Appliance{brand: "美的"}}
}

func (mf *MideaFactory) CreateAirConditioner() IAppliance {
    return &AirConditioner{Appliance: Appliance{brand: "美的"}}
}

func main() {
    // 使用格力工厂创建格力家电
    greeFactory := &GreeFactory{}
    greeTV := greeFactory.CreateTV()
    greeAC := greeFactory.CreateAirConditioner()

    greeTV.Operate()
    greeAC.Operate()

    fmt.Println()

    // 使用美的工厂创建美的家电
    mideaFactory := &MideaFactory{}
    mideaTV := mideaFactory.CreateTV()
    mideaAC := mideaFactory.CreateAirConditioner()

    mideaTV.Operate()
    mideaAC.Operate()
}

Appliance 结构体表示家电的基本属性,包括品牌。TVAirConditioner 是具体产品,实现了 IAppliance 接口。AbstractFactory 定义了创建家电的抽象工厂接口,包括创建电视和空调的方法。GreeFactoryMideaFactory 分别是格力和美的品牌的具体工厂,实现了抽象工厂接口。在 main 函数中,我们使用不同的工厂创建格力和美的家电,并调用它们的 Operate 方法。

相关推荐
stark张宇14 小时前
Go语言runtime全景图:从编译到GC,带你彻底吃透Go的底层血脉
后端·go
吴声子夜歌17 小时前
Java面试——设计模式(一)
java·设计模式·面试
名字还没想好☜18 小时前
Go 用 slices/maps 标准库泛型函数:告别手写 Contains、Sort、去重(Go 1.21)
开发语言·后端·算法·golang·go
吴声子夜歌1 天前
Java面试——设计模式(二)
java·设计模式·面试
Larcher2 天前
SDD 项目开发步骤与提示词
人工智能·设计模式·架构
运维开发笔记2 天前
5.2 Go 数组进阶学习笔记(多维、排序、搜索)
go
阿无,2 天前
设计模式之责任链模式
设计模式·责任链模式
newerp2 天前
Redis 操作与缓存策略
后端·程序员·go
newerp2 天前
GORM ORM 基础
后端·程序员·go
newerp2 天前
CRUD 操作与预处理语句
后端·程序员·go