当前位置: 首页 > article >正文

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

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


文章目录

    • 工厂方法模式
      • 1. 介绍
      • 2. 优点
      • 3. 类图
      • 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. 实现

// 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{}
}

源码

// 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())
}

http://www.kler.cn/a/511983.html

相关文章:

  • 第3章:Python TDD更新测试用例测试Dollar类
  • 高等数学:映射与函数
  • AUTOSAR从入门到精通-自动驾驶测试技术
  • 【爬虫】使用 Scrapy 框架爬取豆瓣电影 Top 250 数据的完整教程
  • MATLAB基础应用精讲-【优化算法】阿基米德优化算法(附MATLAB代码实现)
  • 4.Spring AI Prompt:与大模型进行有效沟通
  • Arcgis Pro安装完成后启动失败的解决办法
  • 亚马逊库存管理sql记录
  • JUnit单元测试
  • OpenAI进军实体机器人:GPT赋能的智能未来
  • 成就与远见:2024年技术与思维的升华
  • [Unity]【游戏开发】 脚本创建物体的实践与技巧
  • C语言--深入printf
  • 阿里云安装mikrotik7配置内网互通
  • 欧拉(Euler 22.03)安装安装proxysql
  • 解决Spring+Vue的跨域问题
  • 精选了几道MySQL的大厂面试题,被提问的几率很高!
  • JavaScript笔记APIs篇02——DOM事件
  • 【Maui】下拉框的实现,绑定键值对
  • 【HarmonyOS NAPI 深度探索12】创建你的第一个 HarmonyOS NAPI 模块
  • [计算机网络]一. 计算机网络概论第一部分
  • 04商品详情
  • react中,使用antd的Upload组件切片上传.zip文件及压缩包的下载
  • PyTorch使用教程(15)-常用开源数据集简介
  • 【STM32-学习笔记-15-】MAX7219点阵屏模块
  • Redis - General - 未授权访问漏洞(用户配置问题)