《golang设计模式》第一部分·创建型模式-05-工厂方法模式(Factory Method)
文章目录
- 1 概述
- 2.1 角色
- 2.2 类图
- 2 代码示例
- 2. 1 设计
- 2.2 代码
- 2.3 类图
- 3. 简单工厂
- 3.1 角色
- 3.2 类图
- 3.3 代码示例
- 3.3.1 设计
- 3.3.2 代码
- 3.3.3 类图
1 概述
工厂方法类定义产品对象创建接口,但由子类实现具体产品对象的创建。
2.1 角色
- Product(抽象产品):它是具体产品的抽象类,可以是结构体,也可以是接口
- ConcreteProduct(具体产品):它实现了抽象产品接口,对应了一种具体产品
- Factroy(抽象工厂):在抽象工厂类中声明了工厂方法,用于返回一个产品。
- ConcreteFactory(具体工厂):实现了在抽象工厂中声明的工厂方法,并可由客户端调用,返回一个具体产品类的实例。
2.2 类图
2 代码示例
2. 1 设计
2.2 代码
package mainimport ("fmt"
)type Product interface {Get()
}type ConcreteProductA struct {Name stringKind string
}func (c *ConcreteProductA) Get() {fmt.Printf("%+v",c)
}
type ConcreteProductB struct {Name stringKind string
}func (c *ConcreteProductB) Get() {fmt.Printf("%+v",c)
}type ConcreteProductC struct {Name stringKind string
}func (c *ConcreteProductC) Get() {fmt.Printf("%+v",c)
}type Factroy interface {CreateProduct(name string) Product
}type ConcreteFactoryA struct {
}func (f *ConcreteFactoryA) CreateProduct(name string) Product {p := &ConcreteProductA{Name: name,Kind:"A",}return p
}type ConcreteFactoryB struct {
}func (f *ConcreteFactoryB) CreateProduct(name string) Product {p := &ConcreteProductB{Name: name,Kind: "B",}return p
}type ConcreteFactoryC struct {
}func (f *ConcreteFactoryC) CreateProduct(name string) Product {p := &ConcreteProductC{Name: name,Kind: "C",}return p
}func CreateProduct(myType int64) Factroy {switch myType {case 1:return &ConcreteFactoryA{}case 2:return &ConcreteFactoryB{}case 3:return &ConcreteFactoryC{}}return nil
}func main() {factory := CreateProduct(1)product := factory.CreateProduct("nginx")product.Get()
}
- 输出
&{Name:nginx Kind:A}
2.3 类图
3. 简单工厂
在产品结构简单的情况下,我们可以把工厂模式简化成一个简单工厂
3.1 角色
- Product(抽象产品):它是具体产品的抽象类,可以是结构体,也可以是接口
- ConcreteProduct(具体产品):它实现了抽象产品接口,对应了一种具体产品
- Factroy(简单工厂):根据一个条件用于返回一个产品
去掉了具体工厂角色,产品由简单工厂直接返回。
3.2 类图
3.3 代码示例
3.3.1 设计
- 定义一个抽象产品
Product - 定义三个具体产品
ConcreteProductA、ConcreteProductB、ConcreteProductC- 它们各自的
Get()方法会访问它本身
- 它们各自的
- 定义一个简单工厂
- 简单工厂的CreateProduct()方法会返回一个产品
- 调用
- 实例化一个简单工厂
- 用简单工厂创建一个产品
- 用产品的Get()方法查询结果
3.3.2 代码
package mainimport ("fmt"
)type Product interface {Get()
}type ConcreteProductA struct {Name stringKind string
}func (c *ConcreteProductA) Get() {fmt.Printf("%+v", c)
}type ConcreteProductB struct {Name stringKind string
}func (c *ConcreteProductB) Get() {fmt.Printf("%+v", c)
}type ConcreteProductC struct {Name stringKind string
}func (c *ConcreteProductC) Get() {fmt.Printf("%+v", c)
}type Factroy struct {
}func (f *Factroy) CreateProduct(myType int64, name string) Product {switch myType {case 1:return &ConcreteProductA{Name: name,Kind: "A",}case 2:return &ConcreteProductB{Name: name,Kind: "B",}case 3:return &ConcreteProductC{Name: name,Kind: "C",}}return nil
}func main() {factory := &Factroy{}product := factory.CreateProduct(1, "nginx")product.Get()
}
- 输出
&{Name:nginx Kind:A}
3.3.3 类图

相关文章:
《golang设计模式》第一部分·创建型模式-05-工厂方法模式(Factory Method)
文章目录 1 概述2.1 角色2.2 类图 2 代码示例2. 1 设计2.2 代码2.3 类图 3. 简单工厂3.1 角色3.2 类图3.3 代码示例3.3.1 设计3.3.2 代码3.3.3 类图 1 概述 工厂方法类定义产品对象创建接口,但由子类实现具体产品对象的创建。 2.1 角色 Product(抽象产…...
Kubernetes 概述
1、K8S 是什么? K8S 的全称为 Kubernetes (K12345678S) 作用 用于自动部署、扩展和管理“容器化(containerized)应用程序”的开源系统。 可以理解成 K8S 是负责自动化运维管理多个容器化程序(比如 Docker)的集群&#…...
Electron + Vue3 + Vite + TS 构建桌面应用
之前是使用React、Electron、TS和webpack来构建桌面应用的。虽然功能齐全,但是打包等等开发的体验不太理想,总感觉太慢了。作为一个开发者,我们总是希望,执行构建命令后,可以快速打包或者启动本地应用,且通过更少的配置,来完成开发体验。 现在的vite已经得到广泛的应用…...
springboot访问请求404的原因
是记录,可能出现错误 可能出现的原因 1.你请求的URL路径不对,比如说你请求的路径是/usr/list,GET方法,但是你UserController上面的RequestMapping是这个样子:RequestMapping(“user”),有可能哈 2.前端的请求时GET方法,后端对应的处理函数的方…...
网络安全零基础该如何自学?
一、为什么选择网络安全? 这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地,网络安全行业地位、薪资随之水涨船高。 未来3-5年,是安全行业的黄金发展期,提前踏入…...
Git(丢失stash数据恢复)
在这里总结一下昨天遇到的问题,我本想将本地代码push到远端仓库,依次运行了以下命令 git init //初始化 git add . //将本地代码添加到暂存区 git commit -m 注释 //将暂存区内容添加到本地仓库中。 结果这时发生了代码冲突,我的代码全没了&a…...
Maven依赖管理
依赖特性: 1、依赖配置 2、依赖传递 3、可选依赖 4、排除依赖 5、依赖范围...
【电网技术复现】考虑实时市场联动的电力零售商鲁棒定价策略(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
R语言中数据重塑(长宽表的转化)
学习笔记,仅供学习使用。 目录 1-什么是整洁的数据? 2-宽表变成长表 示例1: 示例2: 示例3: 3-长表变宽表 示例1: 示例2: 1-什么是整洁的数据? 按照Hadley的表述…...
C# Blazor 学习笔记(10):依赖注入
文章目录 前言Blazor 依赖注入依赖注入用于解决什么问题?依赖注入的生命周期。测试代码 总结 前言 Blazor 具有前后端不分离模式,但是如何直接调用需要一定的设置 Blazor 依赖注入 依赖注入在spring里面很常见,毕竟.NET 是个巨型融合怪。只…...
接口请求(get、post、head等)详解
一.接口请求的六种常见方式: 1、Get 向特定资源发出请求(请求指定页面信息,并返回实体主体) 2、Post 向指定资源提交数据进行处理请求(提交表单、上传文件),又可能导致新的资源的建…...
【【萌新的STM32学习-4】】
萌新的STM32学习-4 STM32系统框架 1.1 Cortex M 内核& 芯片 F1有四个驱动单元 四个被动单元 AHB 高级高性能总线 APB 高级外围总线 部分系统结构 最上面的ICode 总线直接连接到了内部Flash 不需要通过总线矩阵 . D Code 总线(D - Bus) 这是Cort…...
C++ Primer Plus第五章 习题
目录 复习题: 1.入口条件循环和出口条件循环之间的区别是什么?各种c循环分别属于其中的哪一种? 2.如果下面的代码片段是有效程序的组成部分,它将打印什么内容? 3.如果下面的代码片段是有效程序的组成部分࿰…...
软考A计划-系统集成项目管理工程师-信息文档和配置管理-上
点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 👉关于作者 专注于Android/Unity和各种游…...
Vue 路由 路由守卫
路由守卫 正如其名, vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航。简单来说,就是在路由跳转 时候的一些钩子,当从一个页面跳转到另一个页面时,可以在跳转前、中、后做一些事情。 当你打开一个页面的前后需…...
基于springboot的课程作业管理系统【附开题|ppt|万字文档(LW)和搭建文档】
主要功能 学生登录: ①首页、个人中心:修改密码、个人信息管理等 ②公告信息管理、课程信息管理、学生选课管理、作业布置管理、作业提交管理、作业评分管理、课程评价管理、课程资源管理 教师登录: ①首页、个人中心:修改密码、…...
关于个人微信API接口的开发
个人微信开发API接口可拓展功能说明 1、个人微信多账号管理、聚合聊天、多个微信号同时登陆、多个微信号集中在一个窗口进行聊天,实现一人多号同时沟通快速提升沟通效率,提升微信营销效率。 2、客服灵活分配:客服主管可自由分配微信号给指定…...
华为PMS API client token auth failed
对接华为pms时出现问题,提示华为PMS API client token auth failed 主要是权限的问题,创建项目的时候选择N/A...
【Java面试丨消息中间件】Kafka
一、kafka是如何保证消息不丢失 1. 介绍 使用kafka在消息的收发过程都有可能会出现消息丢失 (1)生产者发送消息到broker丢失 (2)消息在broker中存储丢失 (3)消费者从broker接收消息丢失 2. 生产者发送消…...
7.数组(一维数组、二维数组、C99中的变长数组、二分查找法)
数组 1.数组的概念2.一维数组2.1 一维数组的创建2.2 一维数组的类型2.3 一维数组的初始化2.4 一维数组的下标2.5 一维数组的输入与输出2.6 一维数组在内存中的存储2.7 利用sizeof()计算数组元素的个数 3.二维数组3.1 二维数组的概念3.2 二维数组的创建3.3 二维数组的初始化3.4 …...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
