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

news/2025/1/21 14:44:39/

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


文章目录


工厂方法模式

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() {// 创建具体工厂AfactoryA := &ConcreteFactoryA{}// 使用工厂A创建产品AproductA := factoryA.CreateProduct()// 使用产品Aprintln(productA.Use())// 创建具体工厂BfactoryB := &ConcreteFactoryB{}// 使用工厂B创建产品BproductB := factoryB.CreateProduct()// 使用产品Bprintln(productB.Use())
}

http://www.ppmy.cn/news/1564981.html

相关文章

Node.js 与 JavaScript 是什么关系

JavaScript 是一种编程语言&#xff0c;而 Node.js 是 JavaScript 的一个运行环境&#xff0c;它们在不同的环境中使用&#xff0c;具有一些共同的语言基础&#xff0c;但也有各自独特的 API 和模块&#xff0c;共同推动着 JavaScript 在前后端开发中的广泛应用。 一、基础语言…

【Linux】15.Linux进程概念(4)

文章目录 程序地址空间前景回顾C语言空间布局图&#xff1a;代码1代码2代码3代码4代码5代码6代码7 程序地址空间前景回顾 历史核心问题&#xff1a; pid_t id fork(); if(id 0) else if(id>0) 为什么一个id可以放两个值呢&#xff1f;之前没有仔细讲。 C语言空间布局图&am…

北京市房屋建筑物轮廓shp数据arcgis高度字段内容下载分析

标题中的“北京市房屋建筑物轮廓shp数据arcgis高度字段”涉及到的是地理信息系统&#xff08;GIS&#xff09;中的数据格式和属性字段。在GIS领域&#xff0c;SHP&#xff08;Shapefile&#xff09;是一种常见的矢量数据格式&#xff0c;用于存储地理空间特征&#xff0c;如点、…

【PCIe 总线及设备入门学习专栏 6.1 -- PCIe MCTP】

文章目录 1 什么是 MCTP?2 MCTP 消息在 PCIe 中的传输特点3 PCIe MCTP 的局限性(1) 出站(Outbound)MCTP 消息分解的限制(2) 入站(Inbound)MCTP 消息组装的限制4 MCTP 消息的实际使用流程发送端处理流程接收端处理流程5 实际使用场景例 1:管理命令传输例 2:监控数据报告例…

实施工程师:面试基础宝典

一.运维工程师和实施工程师的区别&#xff1a;工作内容不同、职能不同、工作形式不同 1.工作内容不同&#xff1a; 运维工程师要对公司硬件和软件进行维护。 硬件包括&#xff1a;机房、机柜、网线光纤、PDU、服 务器、网络设备、安全设备等。 实施工程师包括常用操作系统、应…

怎么使用langchain和ollama自己简单开发搭建一个本地有记忆的大模型?

环境&#xff1a; langchain ollama 问题描述&#xff1a; 怎么使用langchain和ollama开发搭建一个本地有记忆的大模型? 之前有个数字人管家项目&#xff0c;需要新增开发数字人后台大模型的记忆功能&#xff0c;测试了一下市面上的开源项目&#xff0c;没有找到满足自己…

Java开发提效秘籍:巧用Apache Commons IO工具库

一、引言 在 Java 开发的广袤领域中&#xff0c;输入输出&#xff08;I/O&#xff09;操作宛如一座桥梁&#xff0c;连接着程序与外部世界&#xff0c;从文件的读取与写入&#xff0c;到网络数据的传输&#xff0c;I/O 操作无处不在&#xff0c;其重要性不言而喻。然而&#xf…

淘宝关键词页面爬取绘图进行数据分析

对爬虫、逆向感兴趣的同学可以查看文章&#xff0c;一对一小班V教学&#xff1a;https://blog.csdn.net/weixin_35770067/article/details/142514698 关键词页面爬取代码 from DrissionPage import WebPage, ChromiumOptions from DataRecorder import Recorder import time …