go设计模式———抽象工厂模式

news2024/12/24 8:26:10

抽象工厂模式概念

在这里插入图片描述

抽象工厂模式是一种设计模式,它允许创建一系列相关的对象,而无需指定具体的类。具体来说,抽象工厂定义了用于创建不同产品的接口,但实际的创建工作则由具体的工厂类完成。每个具体工厂负责创建一组相关的产品,这些产品在一起使用时是兼容的。

抽象工厂模式的精髓在于它提供了一种 将对象的创建与使用解耦 的方法,使得客户端代码可以在不依赖具体类的情况下创建和使用一系列相关的对象。以下是抽象工厂模式的核心精髓和优点:

1. 产品族的创建

抽象工厂模式允许创建一系列相关或相互依赖的对象,而不仅仅是一个对象。通过抽象工厂,客户端可以一次性获取到一组互相兼容的产品。例如,使用不同的工厂,可以轻松切换不同风格的家具(现代或古典),而无需更改客户端代码。

2. 解耦

客户端代码与具体的产品类解耦。客户端通过抽象工厂接口与具体工厂进行交互,而不需要知道具体的产品类或如何创建这些产品。这样,产品的具体实现细节与客户端代码隔离开来,客户端只依赖于抽象工厂和产品接口。

3. 一致性保证

通过确保产品的一致性来维护产品的兼容性。例如,抽象工厂模式可以保证创建的桌子和椅子是同一风格的,并且它们能够很好地配合在一起使用。这对于需要保证一组相关产品的兼容性是很重要的。

4. 易于扩展

当需要引入新的产品变体(如新风格的家具)时,只需创建新的具体工厂类来实现新的产品组。客户端代码无需修改,只需要使用新的工厂即可。这使得系统具有很好的扩展性和灵活性。

5. 集中管理

将对象的创建集中在工厂中,可以更容易地管理和维护这些对象的创建逻辑。例如,可以在工厂中实现对象的缓存、初始化或其他复杂的创建逻辑,而客户端代码只关注对象的使用,而不关心其创建过程。

例子:家具工厂

在这个例子中,我们有一个家具工厂的系统。每个工厂生产不同风格的家具,像是现代风格和古典风格。

概念映射
  1. 抽象工厂接口FurnitureFactory):定义了创建各种家具的方法,比如创建桌子和椅子。
  2. 具体工厂类ModernFurnitureFactoryClassicFurnitureFactory):实现了抽象工厂接口,负责创建具体风格的家具。
  3. 产品接口TableChair):定义了家具的公共行为。
  4. 具体产品类ModernTableModernChairClassicTableClassicChair):实现了具体的家具样式。
实现

1. 抽象工厂接口

// FurnitureFactory 定义了创建各种家具的方法
type FurnitureFactory interface {
    CreateTable() Table
    CreateChair() Chair
}

2. 具体工厂类

// ModernFurnitureFactory 现代家具工厂
type ModernFurnitureFactory struct{}

func (f *ModernFurnitureFactory) CreateTable() Table {
    return &ModernTable{}
}

func (f *ModernFurnitureFactory) CreateChair() Chair {
    return &ModernChair{}
}

// ClassicFurnitureFactory 古典家具工厂
type ClassicFurnitureFactory struct{}

func (f *ClassicFurnitureFactory) CreateTable() Table {
    return &ClassicTable{}
}

func (f *ClassicFurnitureFactory) CreateChair() Chair {
    return &ClassicChair{}
}

3. 产品接口

// Table 家具接口:桌子
type Table interface {
    Style() string
}

// Chair 家具接口:椅子
type Chair interface {
    Style() string
}

4. 具体产品类

// ModernTable 现代桌子
type ModernTable struct{}

func (t *ModernTable) Style() string {
    return "现代桌子"
}

// ModernChair 现代椅子
type ModernChair struct{}

func (c *ModernChair) Style() string {
    return "现代椅子"
}

// ClassicTable 古典桌子
type ClassicTable struct{}

func (t *ClassicTable) Style() string {
    return "古典桌子"
}

// ClassicChair 古典椅子
type ClassicChair struct{}

func (c *ClassicChair) Style() string {
    return "古典椅子"
}

5. 客户端代码

func main() {
    var factory FurnitureFactory

    // 选择现代家具工厂
    factory = &ModernFurnitureFactory{}
    fmt.Println(factory.CreateTable().Style()) // 输出: 现代桌子
    fmt.Println(factory.CreateChair().Style()) // 输出: 现代椅子

    // 选择古典家具工厂
    factory = &ClassicFurnitureFactory{}
    fmt.Println(factory.CreateTable().Style()) // 输出: 古典桌子
    fmt.Println(factory.CreateChair().Style()) // 输出: 古典椅子
}

总结

在这个例子中:

  • 抽象工厂接口 FurnitureFactory 定义了创建家具的方法。
  • 具体工厂 ModernFurnitureFactoryClassicFurnitureFactory 实现了这个接口,负责创建具体风格的家具。
  • 产品接口 TableChair 定义了家具的通用行为。
  • 具体产品 ModernTableModernChairClassicTableClassicChair 实现了具体风格的家具。

通过这种方式,客户端代码只与抽象工厂接口和产品接口交互,不需要关心具体的产品实现细节。只要替换工厂类,就可以很方便地切换不同风格的家具,而不需要修改客户端代码。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

谷歌账号停用后申诉了,也收到了谷歌的邮件,如何判断谷歌申诉是否成功,成功了怎么办?被拒绝谷歌账号就废了吗?

似乎是谷歌分工机制的更新,最近谷歌账号“被停用”的情况貌似多了起来,许多朋友在谷歌账号提示活动异常,要输入手机号码恢复账号的时候,无论是否立刻恢复,很快好像就迎来了“您的账号已停用”的结果。或者有一些朋友许…

多元统计分析——基于R语言的单车使用情况可视化分析

注:基于R语言的单车使用情况可视化分析为实验记录,存在不足,自行改进。 一、提出问题(要解决或分析的问题) 1 、用户对共享单车的使用习惯,环境对共享单车运营带来的影响? 2 、共享单车的租赁…

【北京仁爱堂】痉挛性斜颈的健康指导

痉挛性斜颈是一种肌肉紧张异常症,仅限于颈部肌肉的肌张力障碍。当患者患有痉挛性斜颈,会表现为颈部肌肉间歇性或持续不规则的收缩,因此患者的头颈部会出现扭曲、歪斜、姿势异常等症状,多发于30-40岁左右中年人 一、 痉挛性斜颈的5…

mac和windows上安装nvm管理node版本

NVM 是 node version manager 的缩写,它是一个用来管理电脑上 node 版本的命令行工具,在日常前端开发中是一个跟 node 一样会经常用到的工具,可以很方便的让我们快速切换不同的node版本。 mac 上安装 nvm 1、下载安装 nvm 下载安装可以直…

【机器学习】逻辑回归原理(极大似然估计,逻辑函数Sigmod函数模型详解!!!)

目录 🍔 逻辑回归应用场景 🍔 极大似然估计 2.1 为什么要有极大似然估计? 2.2 极大似然估计步骤 2.3 极大似然估计的例子 🍔 Sigmod函数模型 3.1 逻辑斯特函数的由来 3.2 Sigmod函数绘图 3.3 进一步探究-加入线性回归 3…

【爬虫】 使用AI编写B站爬虫代码

记录一次,自己不写一行代码,所有的代码全由AI编写的过程。 本次使用的AI工具为:Claude 其他AI工具同理。 首先,观察哔哩哔哩网页的结构,定位到了包含视频信息的关键元素。右键检查或打开F12,找到最左侧的这…

2024前端面试题-js篇

1.js有哪些数据类型 基础数据类型:string,number,boolean,null,undefined,bigInt,symbol 引用数据类型:Object 2.js检测数据类型的方式 typeof:其中数组、对象、null都会被判断为object&…

基于WebSocket打造的一款SSH客户端

引用:Java打造一款SSH客户端,而且已开源_java ssh客户端-CSDN博客 由于原作者是放在Github上,不方便下载,所以下载下来,转存到码云上,地址:https://gitee.com/lfw1024/web-ssh 为了满足一些小白…

计算机毕业设计选题推荐-股票数据可视化分析与预测-Python爬虫

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

Windows10拿到shell后远程登录

一、准备工作 kali机:192.168.19.130 win10:192.168.19.133 主机:192.168.1.73(自己操作可以在kali上,我这是因为反弹的shell在主机上) 二、开启远程登录 1.win10上关闭实时保护,并且运行了…

[C++] C++11详解 (一)

标题:[C] C11详解 (一) 水墨不写bug 目录 前言 一、列表初始化 二、STL的初始化列表(initializer_list —— Cplusplus.com) 三、声明方式(auto、decltype、nullptr) 1.auto ​编辑 2.decltype 正文开始&#x…

Spark环境搭建-Local

目录 Local下的角色分布: Anaconda On Linux 安装 (单台服务器) 1.下载安装 2.国内源 下载Spark安装包 1.下载 2.解压 3.环境变量 测试 监控 Local下的角色分布: 资源管理: Master:Local进程本身 Worker:L…

UE5.4 - 编辑器页面和概念术语

目录 一. 打开新项目 二. 主页面 1.菜单栏 2.工具栏 3.视口 4.内容侧滑菜单/内容浏览器 5.底部工具栏 6.大纲 7.细节面板 三. 虚幻引擎术语 四. 进一步的术语 五. 总结 一. 打开新项目 选择 虚幻引擎 -> 库 -> 启动 选择类型,选择示例的项目,可以把这些都选选…

探索WebSocket在ASP.NET Core中的实时通信应用与实现策略

文章目录 前言一、创建 ASP.NET Core 项目二、配置中间件以支持 WebSocket1.启动类Program.cs2.WebSocket连接管理器3.WebSocket事件管理器4.WebSocket连接入口 三、客户端实现总结 前言 在 ASP.NET Core 中集成 WebSocket 是一种实现实时通信的有效方式。WebSocket 提供了一个…

什么是TCP三次握手和四次挥手,TCP协议详细解析!零基础入门到精通,收藏这一篇就够了

TCP是TCP/IP协议族中一个最核心的协议,它向下使用网络层IP协议,向上为应用层HTTP、FTP、SMTP、POP3、SSH、Telnet等协议提供支持。本文给出TCP报文格式的详细说明,介绍网络数据包传递中如何进行地址解析、建立TCP连接的三次握手过程以及断开T…

【docker】使用github action来自动发布项目到dockerhub

本文首发于 ❄️慕雪的寒舍 使用github action来自动发布项目到dockerhub。参考 https://msdemt.github.io/p/github-action-build-docker/ 博客 1.准备工作 1.1 dockerhub token https://hub.docker.com/settings/security 登录dockerhub,在用户的account settin…

【具体数学 Concrete Mathematics】1.1 递归问题 讲义

【具体数学 Concrete Mathematics】1.1 递归问题 导入 本节(1.1、1.1.1-1.1.3)主要围绕《具体数学》第一章 递归问题(Recurrent Problems)讲义部分的三个问题展开,分别是汉诺塔、平面上的直线以及约瑟夫问题。下面简单介绍一下递归问题和数学…

复数的处理

复数的处理 复数 V V V 定义为在 ( x , y ) (x,y) (x,y)-平面中实数对的有序集合。在这方面,复数可以被视为原点 ( 0 , 0 ) (0,0) (0,0) 上的向量。从这个角度看,复数的加法类似于 ( x , y ) (x,y) (x,y)-平面中向量的加法。 然而,乘法…

Vue3 国际化i18n语言库 网站多语言切换

介绍 在 Vue 3 项目中,国际化(i18n)是一个常见的需求,它允许你的应用支持多种语言,并根据用户的语言偏好显示相应的内容。为了实现国际化,你可以使用 vue-i18n 这个库,它是 Vue 官方推荐的国际…

vue常见**MS题 [2]

vue问题及理解 1、介绍一下vue2和vue3的区别 ‌Vue2和Vue3的主要区别体现在双向数据绑定原理、生命周期钩子函数、API、多根节点、性能和体积等方面。‌‌双向数据绑定原理‌:Vue2使用Object.defineProperty实现双向数据绑定,而Vue3则利用ES6的Proxy特性…