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

《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 类图

«interface»
Product
+Get()
ConcreteProductA
+Get()
ConcreteProductB
+Get()
«interface»
Factroy
+CreateProduct()
ConcreteFactroyA
+CreateProduct() : Product
ConcreteFactroyB
+CreateProduct() : Product
Client

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 类图

«interface»
Product
+Get()
ConcreteProductA
+string Name
+string Kind
+Get()
ConcreteProductB
+string Name
+string Kind
+Get()
ConcreteProductC
+string Name
+string Kind
+Get()
«interface»
Factroy
+CreateProduct()
ConcreteFactroyA
+CreateProduct() : Product
ConcreteFactroyB
+CreateProduct() : Product
ConcreteFactroyC
+CreateProduct() : Product

3. 简单工厂

在产品结构简单的情况下,我们可以把工厂模式简化成一个简单工厂

3.1 角色

  • Product(抽象产品):它是具体产品的抽象类,可以是结构体,也可以是接口
  • ConcreteProduct(具体产品):它实现了抽象产品接口,对应了一种具体产品
  • Factroy(简单工厂):根据一个条件用于返回一个产品

去掉了具体工厂角色,产品由简单工厂直接返回。

3.2 类图

«interface»
Product
+Create()
ConcreteProductA
+Create()
ConcreteProductB
+Create()
Factroy
+CreateProduct() : Product

3.3 代码示例

3.3.1 设计

  • 定义一个抽象产品Product
  • 定义三个具体产品ConcreteProductAConcreteProductBConcreteProductC
    • 它们各自的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 类图

«interface»
Product
+Get()
ConcreteProductA
+Name
+Kind
+Cet()
ConcreteProductB
+Name
+Kind
+Get()
ConcreteProductC
+Name
+Kind
+Get()
Factroy
+CreateProduct() : Product

在这里插入图片描述

相关文章:

《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的表述&#xf…...

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.如果下面的代码片段是有效程序的组成部分&#xff0…...

软考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 …...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

centos 7 部署awstats 网站访问检测

一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...

GitHub 趋势日报 (2025年06月08日)

📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...