Golang学习笔记_28——工厂方法模式

Golang学习笔记_25------协程
Golang学习笔记_26------通道
Golang学习笔记_27------单例模式


文章目录

    • 工厂方法模式
      • [1. 介绍](#1. 介绍)
      • [2. 优点](#2. 优点)
      • [3. 类图](#3. 类图)
      • [4. 实现](#4. 实现)
    • 源码

工厂方法模式

1. 介绍

工厂方法模式(Factory Method)是一种创建型设计模式,它提供了一种创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法模式让类的实例化推迟到子类中进行

2. 优点

  1. 解耦:将对象的创建与使用分离,客户端不需要知道具体的类名。

  2. 扩展性:增加新的产品类时,只需添加相应的工厂类即可,符合开闭原则。

  3. 单一职责原则:将创建对象的代码封装在工厂中,职责单一。

3. 类图

  1. Product(产品接口):定义了产品的接口,所有具体产品都要实现这个接口。

  2. ConcreteProduct(具体产品):实现了Product接口的具体类。

  3. Creator(工厂接口):声明了工厂方法,用于返回一个Product对象。

  4. ConcreteCreator(具体工厂):实现了工厂接口,返回具体产品的实例。

    复制代码
     +-----------------+
     |     Product     |<----------------+
     +-----------------+                 |
     | + Use()         |                 |
     +-----------------+                 |
             ^                           |
             |                           |
     +-----------------+         +-----------------+
     | ConcreteProductA|         | ConcreteProductB|
     +-----------------+         +-----------------+
     | + Use()         |         | + Use()         |
     +-----------------+         +-----------------+
    
     +-----------------+
     |     Creator     |<----------------+
     +-----------------+                 |
     | + CreateProduct()|                |
     +-----------------+                 |
             ^                           |
             |                           |
     +-----------------+         +-----------------+
     | ConcreteCreatorA|         | ConcreteCreatorB|
     +-----------------+         +-----------------+
     | + CreateProduct()|        | + CreateProduct()|
     +-----------------+         +-----------------+

4. 实现

go 复制代码
// Product 是产品接口
type Product interface {
	Use() string
}

// ConcreteProductA 是具体产品A
type ConcreteProductA struct{}

func (p *ConcreteProductA) Use() string {
	return "使用产品A"
}

// ConcreteProductB 是具体产品B
type ConcreteProductB struct{}

func (p *ConcreteProductB) Use() string {
	return "使用产品B"
}

// Factory 是工厂接口
type Factory interface {
	CreateProduct() Product
}

// ConcreteFactoryA 是具体工厂A
type ConcreteFactoryA struct{}

func (f *ConcreteFactoryA) CreateProduct() Product {
	return &ConcreteProductA{}
}

// ConcreteFactoryB 是具体工厂B
type ConcreteFactoryB struct{}

func (f *ConcreteFactoryB) CreateProduct() Product {
	return &ConcreteProductB{}
}

源码

go 复制代码
// Product 是产品接口
type Product interface {
	Use() string
}

// ConcreteProductA 是具体产品A
type ConcreteProductA struct{}

func (p *ConcreteProductA) Use() string {
	return "使用产品A"
}

// ConcreteProductB 是具体产品B
type ConcreteProductB struct{}

func (p *ConcreteProductB) Use() string {
	return "使用产品B"
}

// Factory 是工厂接口
type Factory interface {
	CreateProduct() Product
}

// ConcreteFactoryA 是具体工厂A
type ConcreteFactoryA struct{}

func (f *ConcreteFactoryA) CreateProduct() Product {
	return &ConcreteProductA{}
}

// ConcreteFactoryB 是具体工厂B
type ConcreteFactoryB struct{}

func (f *ConcreteFactoryB) CreateProduct() Product {
	return &ConcreteProductB{}
}

func test() {
	// 创建具体工厂A
	factoryA := &ConcreteFactoryA{}
	// 使用工厂A创建产品A
	productA := factoryA.CreateProduct()
	// 使用产品A
	println(productA.Use())

	// 创建具体工厂B
	factoryB := &ConcreteFactoryB{}
	// 使用工厂B创建产品B
	productB := factoryB.CreateProduct()
	// 使用产品B
	println(productB.Use())
}
相关推荐
Vizio<3 小时前
STM32HAL库开发笔记-STM32CubeMX点灯
笔记·stm32·嵌入式硬件
找方案3 小时前
hello-agents 学习笔记:智能体发展史 —— 从符号逻辑到 AI 协作的进化之旅
人工智能·笔记·学习·智能体·hello-agents
skywalk81634 小时前
Auto-Coder用Qwen3-Coder-30B-A3B-Instruct模型写一个学习汉字的项目
人工智能·学习·auto-coder
MarkHD4 小时前
智能体在车联网中的应用:一份详尽到每日的100天学习路线图
学习
软件技术NINI4 小时前
如何学习前端
前端·学习
TedLeeX4 小时前
【Nordic随笔】从零开始学习使用nRF Connect SDK(一、安装ncs3.2.0步骤)
学习·nordic·zephyr·ncs·nrf54
车载测试工程师4 小时前
CAPL学习-AVB交互层-功能函数-控制类函数
学习·tcp/ip·以太网·capl·canoe
蒙奇D索大4 小时前
【数据结构】考研408 | 平方探测法精讲:跳跃探查的艺术与聚集迷思
数据结构·笔记·考研·改行学it
迅为电子4 小时前
迅为iTOP-Hi3516开发板linux驱动开发资料全面上线,构建从入门到精通的完整学习路径!
linux·驱动开发·学习
xwz小王子4 小时前
UniBYD:超越人类示教模仿的跨实体机器人操作学习统一框架
学习·算法·机器人·跨实体