《golang设计模式》第一部分·创建型模式-04-抽象工厂模式(Abstract Factory)
文章目录
- 1. 概述
- 1.1 角色
- 1.2 类图
- 2. 代码示例
- 2.1 设计
- 2.2 代码
- 2.3 类图
1. 概述
1.1 角色
- AbstractFactory(抽象工厂):它声明了一组用于创建产品的方法,每一个方法对应一种产品。
- ConcreteFactory(具体工厂):它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。
- AbstractProduct(抽象产品):它为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。
- ConcreteProduct(具体产品):它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。
1.2 类图
2. 代码示例
2.1 设计
- 定义
抽象产品A- 定义
具体产品A-1- 它有
Name、Weight两个成员 - 它的
SetName()、SetWeight()两个方法分别负责设置以上两个成员 - 它的
Get()方法获取它本身的信息
- 它有
- 定义
具体产品A-2- 它有
Name、Weight两个成员 - 它的
SetName()、SetWeight()两个方法分别负责设置以上两个成员 - 它的
Get()方法获取它本身的信息
- 它有
- 定义
- 定义
抽象产品B- 定义
具体产品B-1- 它有
Name、Height两个成员 - 它的
SetName()、SetHeight()两个方法分别负责设置以上两个成员 - 它的
Get()方法获取它本身的信息
- 它有
- 定义
具体产品B-2- 它有
Name、Height两个成员 - 它的
SetName()、SetHeight()两个方法分别负责设置以上两个成员 - 它的
Get()方法获取它本身的信息
- 它有
- 定义
- 定义
抽象工厂- 定义
具体工厂1- 它的方法
SetProductA()设置具体产品A-1 - 它的方法
SetProductB()设置具体产品B-1
- 它的方法
- 定义
具体工厂2- 它的方法
SetProductA()设置具体产品A-2 - 它的方法
SetProductB()设置具体产品B-2
- 它的方法
- 定义
- 定义一个函数
CreateFactory(),用来创建具体工厂 - 调用
- 用
CreateFactory()函数实例化具体工厂1——factory1 - 用
factory1实例化产品A-1和产品B-1,并查看结果 - 用
CreateFactory()函数实例化具体工厂2——factory2 - 用
factory2实例化产品A-2和产品B-2,并查看结果
- 用
2.2 代码
package mainimport "fmt"// 定义抽象产品A
type AbstractProductA interface {SetName(name string)SetWeight(weight int64)Get()
}// 定义具体产品A-1
type ConcreteProductA1 struct {Name stringWeight int64
}func (c *ConcreteProductA1) SetName(name string) {c.Name = name
}func (c *ConcreteProductA1) SetWeight(weight int64) {c.Weight = weight
}func (c *ConcreteProductA1) Get() {fmt.Printf("%v\n", c)
}// 定义具体产品A-2
type ConcreteProductA2 struct {Name stringWeight int64
}func (c *ConcreteProductA2) SetName(name string) {c.Name = name
}func (c *ConcreteProductA2) SetWeight(weight int64) {c.Weight = weight
}
func (c *ConcreteProductA2) Get() {fmt.Printf("%v\n", c)
}// 定义抽象产品B
type AbstractProductB interface {SetName(name string)SetHeight(height int64)Get()
}// 定义具体抽象产品B-1
type ConcreteProductB1 struct {Name stringHeight int64
}func (c *ConcreteProductB1) SetName(name string) {c.Name = name
}func (c *ConcreteProductB1) SetHeight(height int64) {c.Height = height
}
func (c *ConcreteProductB1) Get() {fmt.Printf("%v\n", c)
}// 定义具体产品B-2
type ConcreteProductB2 struct {Name stringHeight int64
}func (c *ConcreteProductB2) SetName(name string) {c.Name = name
}func (c *ConcreteProductB2) SetHeight(height int64) {c.Height = height
}
func (c *ConcreteProductB2) Get() {fmt.Printf("%v\n", c)
}// Factory部分// 定义抽象工厂
type Factory interface {SetProductA(name string, weight int64) AbstractProductASetProductB(name string, height int64) AbstractProductB
}// 定义具体工厂1
type Factory1 struct {
}func (f *Factory1) SetProductA(name string, weight int64) AbstractProductA {a := &ConcreteProductA1{}a.SetName(name)a.SetWeight(weight)return a
}func (f *Factory1) SetProductB(name string, height int64) AbstractProductB {a := &ConcreteProductB1{}a.SetName(name)a.SetHeight(height)return a
}// 定义具体工厂2
type Factory2 struct {
}func (f *Factory2) SetProductA(name string, weight int64) AbstractProductA {a := &ConcreteProductA2{}a.SetName(name)a.SetWeight(weight)return a
}func (f *Factory2) SetProductB(name string, height int64) AbstractProductB {a := &ConcreteProductB2{}a.SetName(name)a.SetHeight(height)return a
}// 写一个创建工厂的函数
func CreateFactory(pType int64) Factory {switch pType {case 1:return &Factory1{}case 2:return &Factory2{}}return nil
}func main() {factory1 := CreateFactory(1)factory1.SetProductA("A1", 3).Get()factory1.SetProductB("B1", 3).Get()factory2 := CreateFactory(2)factory2.SetProductA("A2", 4).Get()factory2.SetProductB("B2", 4).Get()
}
- 输出
&{A1 3}
&{B1 3}
&{A2 4}
&{B2 4}
2.3 类图

相关文章:
《golang设计模式》第一部分·创建型模式-04-抽象工厂模式(Abstract Factory)
文章目录 1. 概述1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1. 概述 1.1 角色 AbstractFactory(抽象工厂):它声明了一组用于创建产品的方法,每一个方法对应一种产品。ConcreteFactory(具体工厂…...
改进粒子群算法优化BP神经网络---回归+分类两种案例
今天采用改进的粒子群算法(LPSO)优化算法优化BP神经网络。本文选用的LPSO算法是之前作者写过的一篇文章:基于改进莱维飞行和混沌映射(10种混沌映射随意切换)的粒子群优化算法,附matlab代码 文章一次性讲解两种案例,回归…...
VSCode和QT联合开发
提示:本文为学习记录,若有错误,请联系作者,谦虚受教。 文章目录 前言一、VSCODE下载二、使用步骤1.下载扩展 二、新建工程1.新建文件夹2.新建工程3.UI界面文件操作4.效果 总结 前言 一、VSCODE下载 下载地址 二、使用步骤 1.下…...
YOLO5-1 使用YOLO5检测 水面漂浮物记录
一 数据集 robflow 漂浮物数据集:buoy Computer Vision Dataset by ai 二 YOLO5管网 yolo5 :https://github.com/ultralytics/yolov5 克隆代码: git clone https://github.com/ultralytics/yolov5 # clone cd yolov5 pip install -r requirements.…...
MongoDB教程-7
正如在MongoDB关系的最后一章中所看到的,为了在MongoDB中实现规范化的数据库结构,我们使用了引用关系的概念,也被称为手动引用,在这个概念中,我们手动将被引用文档的id存储在其他文档中。然而,在一个文档包…...
Redisson提供优秀的并发控制机制
1. JDK集合类 对于JDK的集合类,forEach方法其实并不能完全避免并发修改异常。 forEach本质上还是一个循环遍历,如果在循环体内直接对集合进行修改,仍然会产生ConcurrentModificationException。 例如: List<String> lis…...
Linux: 设置qmake的Qt版本
Qt开发,qmake会对应一个Qt版本,有时候需要切换这个版本,例如把qmake从Qt5.12切换到Qt5.9, 怎么操作呢? 案例如下: 银河麒麟V10系统,下载安装了Qt5.9.8,但是检查qmake发现它使用的是5.12.8&…...
使用LLM插件从命令行访问Llama 2
大家好,最近的一个大新闻是Meta AI推出了新的开源授权的大型语言模型Llama 2,这是一项非常重要的进展。Facebook最初的LLaMA模型于今年2月发布,掀起了开源LLM领域的创新浪潮——从微调变体到从零开始的再创造。 如果在Llama 2版本发布之日&a…...
gateway过滤器没生效,特殊原因
看这边文章的前提,你要会gateway,知道过滤器怎么配置? 直接来看过滤器,局部过滤器 再来看配置 请求路径 http://127.0.0.1:8080/appframework/services/catalog/catalogSpecials.json?pageindex1&pagesize10&pkidd98…...
长相思追剧小游戏
看效果图 Vue长相思 刚学Vue,正好在追剧,看到这个小案例觉得挺好玩的,第一天学,代码太简陋了 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name&qu…...
leetcode做题笔记51
按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。 每一种…...
Windows同时安装两个版本的JDK并随时切换,以JDK6和JDK8为例,并解决相关存在的问题(亲测有效)
Windows同时安装两个版本的JDK并随时切换,以JDK6和JDK8为例,并解决相关存在的问题(亲测有效) 1.下载不同版本JDK 这里给出JDK6和JDK的百度网盘地址,具体安装过程,傻瓜式安装即可。 链接:http…...
【ChatGPT辅助学Rust | 基础系列 | Cargo工具】Cargo介绍及使用
文章目录 前言一,Cargo介绍1,Cargo安装2,创建Rust项目2,编译项目:3,运行项目:4,测试项目:5,更新项目的依赖:6,生成项目的文档…...
全面了解CPU Profiler:解读CPU性能分析工具的核心功能与用法
关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 目录 一、导读二、概览三、使用3.1 通过调用系统API3.2 通过Android Stu…...
rust format!如何转义{},输出{}?
在Rust中,如果你想要在字符串中包含花括号 {} ,你需要使用双花括号 {{}} 来进行转义。这是因为单个花括号 {} 在字符串中表示占位符,用于格式化字符串。 以下是一个示例: fn main() {let text "这是一个示例: {…...
真人AI写真的制作方法-文生图换脸
AI写真最近火起来了,特别是某款现象级相机的出现,只需要上传自己的照片,就能生成漂亮的写真照,这一产品再次带火了AI绘画。今天我就来分享一个使用Stable Diffusion WebUI制作真人AI写真的方法,不用训练,快…...
vscode如何包含第三方库
方法1:使用C Extension 在include 的 rapidjson的头文件时,vscode会提示找不到的问题 悬停,点击黄色提示 Edit "includePath" setting Include Path,输入rapidjson的include路径 /Users/xxx/workspaces/rapidjson-1.1.…...
【Docker】Docker安装Consul
文章目录 1. 什么是Consul2. Docker安装启动Consul 点击跳转:Docker安装MySQL、Redis、RabbitMQ、Elasticsearch、Nacos等常见服务全套(质量有保证,内容详情) 1. 什么是Consul Consul是HashiCorp公司推出的开源软件,提…...
《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(20)-Fiddler精选插件扩展安装让你的Fiddler开挂到你怀疑人生
1.简介 Fiddler本身的功能其实也已经很强大了,但是Fiddler官方还有很多其他扩展插件功能,可以更好地辅助Fiddler去帮助用户去开发、测试和管理项目上的任务。Fiddler已有的功能已经够我们日常工作中使用了,为了更好的扩展Fiddler,…...
计算机top命令
top 快捷键 1 核心参数 1 1 参考资料 [1]. https://blog.csdn.net/weixin_45465395/article/details/115728520 [2].https://www.cnblogs.com/liushui-sky/p/13224762.html...
【flash-attn安装成功却import失败?一个ABI参数引发的‘血案’】
1. 为什么flash-attn安装成功却import失败? 最近在部署Llama2模型时,遇到了一个让人抓狂的问题:明明用pip安装了flash-attn,执行import时却报错提示找不到这个包。更诡异的是,pip list明明显示安装成功了,…...
基于DeepSeek的本地部署AI智能体:锁脸功能实现完整方案
基于DeepSeek的本地部署AI智能体:锁脸功能实现完整方案 一、项目概述与架构设计 1.1 任务目标 开发一个具有锁脸功能的AI智能体,能够: 完全本地部署,无需依赖云端服务 锁定智能体的角色设定、人格特征和对话风格 支持多轮对话记忆 提供RESTful API接口 保证角色设定在任…...
AI集成开发工程师的技术实践与转型之路
第一章:技术架构演进与AI融合趋势 1.1 传统开发范式的演进 现代软件开发正经历从单一业务系统向智能化业务系统的转型。传统的.NET技术栈作为企业级应用开发的基石,其技术架构也在不断演进: // 典型的三层架构示例 public class BusinessLogic {private readonly IDataAc…...
从LVGL V7.11到V9.1:我维护中文文档这三年踩过的坑与实战经验
从LVGL V7.11到V9.1:一个中文文档维护者的技术叙事 三年前,当我第一次在嵌入式项目中尝试使用LVGL时,完全没想到这个轻量级图形库会成为我技术生涯中的重要篇章。作为国内最早系统维护LVGL中文文档的开发者之一,这段跨越三个大版本…...
R Markdown网站生成器使用教程:如何快速搭建技术文档网站 [特殊字符]
R Markdown网站生成器使用教程:如何快速搭建技术文档网站 📊 【免费下载链接】rmarkdown Dynamic Documents for R 项目地址: https://gitcode.com/gh_mirrors/rm/rmarkdown R Markdown是一个强大的动态文档生成工具,能够将代码、输出…...
H5页面如何优雅跳转iOS App Store?解决点击后二次跳转的坑
H5页面如何优雅跳转iOS App Store?解决点击后二次跳转的坑 在移动互联网时代,H5页面与原生App的无缝衔接已经成为提升用户体验的关键环节。特别是对于电商、社交、内容平台等需要引导用户下载App的场景,如何实现从H5页面到iOS App Store的平…...
终极指南:CleanArchitecture项目Angular 17快速升级实战与最佳实践
终极指南:CleanArchitecture项目Angular 17快速升级实战与最佳实践 【免费下载链接】CleanArchitecture Clean Architecture Solution Template for ASP.NET Core 项目地址: https://gitcode.com/GitHub_Trending/cle/CleanArchitecture 如果你正在使用Clean…...
终极Windows 11系统优化指南:使用Win11Debloat让你的电脑飞起来!
终极Windows 11系统优化指南:使用Win11Debloat让你的电脑飞起来! 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other change…...
网页资源下载革新工具:ResourcesSaverExt高效使用指南
网页资源下载革新工具:ResourcesSaverExt高效使用指南 【免费下载链接】ResourcesSaverExt Chrome Extension for one click downloading all resources files and keeping folder structures. 项目地址: https://gitcode.com/gh_mirrors/re/ResourcesSaverExt …...
FPGA新手入门:用Verilog手搓一个交通灯控制器(附完整代码与仿真)
FPGA实战:从零构建智能交通灯控制系统的Verilog全流程指南 引言 第一次接触FPGA开发时,我被硬件描述语言的独特思维方式所吸引。与软件编程不同,Verilog让我们能够直接描述硬件电路的行为。交通灯控制系统作为数字电路设计的经典案例…...
