抽象工厂模式与工厂模式类似,被认为是工厂方法模式的另一层抽象.抽象工厂模式围绕创建其他工厂的超级工厂工作.

1.角色:

1.1抽象产品:

构成产品系列的一组不同但相关的产品的声明接口.

1.2具体产品:

实现抽象产品接口的类,主要用于定义产品对象,由相应的具体工厂创建.

1.3抽象工厂:

创建抽象产品对象的操作接口.

1.4具体工厂:

实现抽象工厂接口的类.用于创建产品对象.每个具体工厂都会生产相应的具体产品.

1.5客户端:

通过抽象接口调用抽象工厂对象和抽象产品对象,客户端能与所有具体工厂或具体产品交互.

2.抽象工厂使用场景:

2.1出于对代码未来扩展性考虑.不希望代码基于具体产品进行构建,可以使用抽象工厂模式.

2.2某个类具有一组抽象方法,并且这个类功能不够明确,可以考虑抽象工厂模式.

2.3如果一个类需要与多种类型的产品交互,可以考虑将工厂方法抽取到具备完整功能的抽象工厂接口中.

3.实现方式:

3.1抽象产品接口:
package itboStudyimport "fmt"// 抽象产品接口
type AbstractProduct interface {GetName() 
}// 具体产品类
type Computer struct {
}//具体产品类中的方法
func (c *Computer) GetName() {fmt.Println("具体产品Computer")
}
3.2抽象工厂接口:
//抽象工厂接口
type AbstractFactory interface {CreateProduct() AbstractProduct
}
3.3具体工厂类及方法:
// 具体工厂类
type ComputerProductFactory struct{}// 初始化具体工厂对象.
func NewComputerProductFactory() ComputerProductFactory {return ComputerProductFactory{}
}// 使用具体工厂对象创建具体产品
func (com *ComputerProductFactory) CreateProduct() Computer {return Computer{}
}
3.4客户端:
func main() {factory := itboStudy.NewComputerProductFactory()product := factory.CreateProduct()product.GetName()
}

4.实战:

4.1抽象接口:
// 电子产品工厂
type InterfaceElectronicFactory interface {MakeComputer() InterfaceComputer
}// 获取电子产品工厂对象
func GetElectronicFactory(brand string) (*LenovoFactory, error) {if brand == "电脑" {return &LenovoFactory{}, nil}return nil, fmt.Errorf("%s", "error brand type")
}
4.2具体工厂类:
// 定义具体工厂类
type LenovoFactory struct{}// 生成联想电脑
func (com *LenovoFactory) MakeComputer() *LenovoComputer {return &LenovoComputer{Computer: Computer{color: "black",size:  14,},}
}
4.3抽象产品接口:
type InterfaceComputer interface {SetColor(color string)SetSize(size int)Getcolor() stringGetsize() int
}type Computer struct {color stringsize  int
}func (com *Computer) SetColor(color string) {com.color = color
}func (com *Computer) SetSize(size int) {com.size = size
}func (com *Computer) GetSize() int {return com.size
}func (com *Computer) GetColor() string {return com.color
}
4.4具体产品类:
// 定义具体产品
type LenovoComputer struct {Computer
}
4.5客户端:
func main() {factory, _ := itboStudy.GetElectronicFactory("电脑")computer := factory.MakeComputer()fmt.Printf("computer:%#v\n", computer.GetColor())
}

5优点:

客户端不知道创建什么类型对象时.

抽象工厂实现了具体的隔离.

抽象工厂可以轻松改变产品系列.

保证产品一致性.

6.缺点:

抽象工厂难以扩展新型产品.如果要支持新型产品需要扩展工厂接口.

可以迟到,但是不会缺席.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/921470.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/921470.shtml
英文地址,请注明出处:http://en.pswp.cn/news/921470.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大狗王 DG1+ 13.6G矿机详细参数解析与性能评测

近年来,随着加密货币挖矿行业的不断发展,越来越多的矿机厂商推出了高性能、低功耗的矿机设备。大狗王(DG1)13.6G矿机便是其中一款备受关注的设备,特别是在LTC(莱特币)、Doge(狗狗币&…

Python 算术运算练习题

计算数字特征值题目描述 编写一个程序,接收用户输入的两个整数 a 和 b(a > b > 0),计算并输出以下结果:a 与 b 的和的平方a 除以 b 的商和余数a 与 b 的平均数(保留 2 位小数)示例请输入整…

OS项目构建效能改进策划方案

一、现状分析与问题定位构建稳定性问题: 表现:非代码变更引发的构建失败(如环境依赖、工具链版本、第三方库更新、资源竞争等)“幽灵构建”时有发生。影响:严重破坏开发流程的顺畅性,耗费大量开发/测试人员…

Ai8051 2.4寸320*240 ILI9341 I8080接口驱动

/*---------------------------------------------------------------------*/ /* --- Web: www.STCAI.com ---------------------------------------------*/ /* 液晶屏驱动程序参考wiki技术网站提供的开源源码,仅供学习使用 */ /*----------------------…

最大似然估计:损失函数的底层数学原理

引言当你第一次看到线性回归时,你是否注意到了作为参数优化关键的损失函数(均方损失),你是否能够理解它的本质和由来。其实,在我第一次接触时,我是感到有些惊讶的,然后试着去强行理解它&#xf…

使用 n8n 结合通义千问大模型构建业务数据库分析智能体

一、项目概述 本项目致力于构建一个结合 n8n 工作流引擎 与 通义千问大模型 的智能体,旨在对庞大的业务数据库进行自动化分析、语义建模及自然语言问答。通过不同工作流的迭代构建,实现了表结构解析、业务含义提取、关系可视化、问答服务等能力&#xff…

css margin外边距重叠/塌陷问题

一、定义 相邻块级元素或父子元素的垂直外边距会合并&#xff08;折叠&#xff09;为单个边距&#xff0c;其大小为单个边距的最大值&#xff08;或如果他们相等&#xff0c;则仅为其中的一个&#xff09;&#xff0c;这种行为称为边距折叠 <div style"margin-bottom: …

可重复读 是否“100%”地解决幻读?

这是一个非常深刻的问题&#xff0c;答案是&#xff1a;几乎解决了&#xff0c;但在一个非常特殊且罕见的边界场景下&#xff0c;理论上仍然可能出现幻读。 因此&#xff0c;严格来说&#xff0c;它并非被“彻底”或“100%”地解决。下面我们来详细分解这个结论&#xff1a;1. …

从零开始的云计算生活——第五十八天,全力以赴,Jenkins部署

目录 一.故事背景 二.安装Jenkins必要插件 1.安装Publish Over SSH 2.安装maven integration插件 3. 配置jenkins并发执行数量 4. 配置邮件地址 三. 基于Jenkins部署PHP环境 1. 下载ansible插件 2. 下载ansible应用 3. 构建项目 ​编辑 使用Jenkins账户生成ssh密钥 …

串口HAL库发送问题

想了很久&#xff0c;不知道该标题起的是否合适&#xff0c;该篇Blog用于记录在使用HAL库的USART模块时实际遇到的一个涉及发送方式的问题&#xff0c;用于提醒自身同时也希望能帮到各位。程序问题叙述先来看一段代码&#xff1a;void CusUSART_SendByte_IT( uint8_t Byte ) { …

CUDA默认流的同步行为

默认流 对于需要指定 cudaStream_t参数的 cuda API&#xff0c;如果将 0作为实参传入&#xff0c;则视为使用默认流&#xff1b;对于不需要指定 cudaStream_t参数的 cuda API&#xff0c;则也视为使用默认流。 在 cuda中&#xff0c;默认流有两种类型&#xff0c;一种是 legacy…

「数据获取」《中国电力统计年鉴》(1993-2024)(含中国电力年鉴)

01、数据简介一、《中国电力统计年鉴》作为全面系统反映中国电力领域发展状况的权威性年度统计资料&#xff0c;涵盖了电力建设、生产、消费及供需等全链条关键信息。其编制工作有着深厚的历史积淀&#xff0c;可追溯至 20 世纪 50 年代&#xff0c;历经数十年的积累与完善&…

《AI大模型应知应会100篇》第68篇:移动应用中的大模型功能开发 —— 用 React Native 打造你的语音笔记摘要 App

&#x1f4f1; 第68篇&#xff1a;移动应用中的大模型功能开发 —— 用 React Native 打造你的语音笔记摘要 App &#x1f3af; 核心目标&#xff1a;零门槛集成大模型&#xff0c;5步开发跨平台智能功能 &#x1f9e9; 适用人群&#xff1a;前端开发者、产品经理、独立开发者 …

FPGA ad9248驱动

ad9248的最高时钟频率65mhz&#xff0c;采用cmos3.3v电压的并行io接口&#xff0c;做成电子模块后一般为双通道adc&#xff0c;有两个对外输出时钟cha_clk与chb_clk&#xff0c;一个并行输入端口&#xff0c;14分辨率的ddr_data&#xff0c;其模块逻辑如下&#xff0c;首先向ad…

Spring MVC 处理请求的流程

Spring MVC 处理请求的流程流程步骤详解第1步&#xff1a;发起请求 (HTTP Request)第2步&#xff1a;映射处理器 (Handler Mapping)第3步&#xff1a;获取适配器 (Handler Adapter)第4步&#xff1a;执行拦截器前置处理 (Interceptors - preHandle)第5步&#xff1a;真正调用处…

敏捷scrum管理实战经验总结

1.敏捷 敏捷的构成 敏捷由实践来源、应用场景、组织文化、领导力、团队、需求、管理、技术、质量、度量、交付、过程改进、大型项目组合管理以及受监管行业中的敏捷等构成 敏捷开发的特点 短发布周期小批量的方式、开展从需求到实现的开发工作高层级的预先规划结合详细的即时规…

南科大适应、协同与规划的完美融合!P³:迈向多功能的具身智能体

作者&#xff1a;Shengli Zhou1^{1}1, Xiangchen Wang1^{1}1, Jinrui Zhang1^{1}1, Ruozai Tian2^{2}2, Rongtao Xu2,3^{2,3}2,3, Feng Zheng1,2^{1,2}1,2单位&#xff1a;1^{1}1南方科技大学&#xff0c;2^{2}2时空智能&#xff0c;3^{3}3穆罕默德本扎耶德人工智能大学论文标题…

自动化流水线

import React, { useState, useEffect } from ‘react’; import { ChevronRight, CheckCircle, Circle, AlertCircle, Clock, Play, Pause, Settings, Code, Server, Shield, Database, Globe, Zap, FileText, Users, GitBranch, Package, Monitor, ChevronDown } from ‘luci…

【高等数学】第十一章 曲线积分与曲面积分——第三节 格林公式及其应用

上一节&#xff1a;【高等数学】第十一章 曲线积分与曲面积分——第二节 对坐标的曲线积分 总目录&#xff1a;【高等数学】 目录 文章目录1. 格林公式2. 平面上曲线积分与路径无关的条件3. 二元函数的全微分求积4. 曲线积分的基本定理1. 格林公式 单连通与复连通区域 设 DDD …

Boost电路:平均状态空间建模

电路特征介绍如图所示是一个非理想情况下的boost电路&#xff0c;其中L1L_{1}L1​和RL1R_{L1}RL1​是分别是电感和串联电阻&#xff1b;C1C_{1}C1​和RC1R_{C1}RC1​是输出电容和串联电阻&#xff1b;Q1Q_{1}Q1​是MOS管&#xff0c;其导通电阻是RonR_{on}Ron​&#xff1b;D1D…