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())
}
相关推荐
刀法如飞14 分钟前
领域驱动 vs 本体驱动:DDD 代码建模与 Ontology 语义建模的对比分析
设计模式·架构设计·领域驱动
Chris _data19 分钟前
c#学习WPF笔记(一)
学习·c#·wpf
AOwhisky7 小时前
Redis 学习笔记(第三期):持久化与主从复制
运维·数据库·redis·笔记·学习·云计算
问心无愧05137 小时前
ctf show web入门160 161
前端·笔记
Tbisnic9 小时前
AI大模型学习第十一天:技术选型、安全防护与金融实战
python·学习·ai·大模型·提示词工程
xmtxz10 小时前
计算机网络基础课程学习心得:从理论抽象到硬核实战的进阶之路
运维·学习
YM52e11 小时前
男孩子在外自我保护指南——用鸿蒙 ArkTS 构建交互式安全教育应用
学习·安全·华为·harmonyos·鸿蒙·鸿蒙系统
我爱cope11 小时前
【Agent智能体26 | 多智能体-多智能体工作流】
人工智能·设计模式·语言模型·职场和发展
小小龙学IT12 小时前
Go 泛型深度解析:从设计哲学到工程实践
服务器·数据库·golang
aXin_ya12 小时前
Ai Vibecoding学习(各个AI的讲解)
学习