技术成神之路:设计模式(五)抽象工厂模式

news2024/11/14 21:57:42

1.介绍


抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定其具体类。这种模式属于工厂模式的一种扩展,它通过引入抽象层来实现工厂方法的组合,从而使得客户端能够使用抽象的接口创建一组相关的产品对象。

2.定义


抽象工厂模式定义了一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

3. 主要作用


抽象工厂模式允许你定义一个创建对象的接口,这些对象之间有关联或依赖关系,而具体的创建逻辑由实现了该接口的具体工厂类负责。这样一来,客户端只需与抽象工厂及其产品接口交互,而不用关心具体的产品实现细节,从而达到了解耦的效果。

到这里你是不是有疑惑,这TM和工厂方法模式有什么区别啊!不急,继续往下看👇

4.解决的问题


  • 客户端代码与具体工厂类的耦合问题,客户端通过抽象接口与具体工厂分离。
  • 系统扩展时可以灵活添加新的产品族,无需修改现有代码。

5.模式原理


包含角色:

  • 抽象工厂(Abstract Factory):定义创建一组产品的接口,每个方法对应一种产品。
  • 具体工厂(Concrete Factory):实现抽象工厂接口,负责创建一组具体产品。
  • 抽象产品(Abstract Product):定义产品的接口,描述产品的公共方法。
  • 具体产品(Concrete Product):实现抽象产品接口,具体产品之间属于同一产品族。

UML类图:
在这里插入图片描述
代码示例:

// 抽象产品:按钮接口
public interface Button {
    void display();
}

// 具体产品:安卓风格按钮
public class AndroidButton implements Button {
    @Override
    public void display() {
        System.out.println("显示安卓风格按钮");
    }
}

// 具体产品:iOS风格按钮
public class IOSButton implements Button {
    @Override
    public void display() {
        System.out.println("显示iOS风格按钮");
    }
}

// 抽象工厂:UI组件工厂
public interface UIFactory {
    Button createButton();
}

// 具体工厂:安卓风格UI组件工厂
public class AndroidUIFactory implements UIFactory {
    @Override
    public Button createButton() {
        return new AndroidButton();
    }
}

// 具体工厂:iOS风格UI组件工厂
public class IOSUIFactory implements UIFactory {
    @Override
    public Button createButton() {
        return new IOSButton();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        // 使用安卓风格工厂创建按钮
        UIFactory androidFactory = new AndroidUIFactory();
        Button androidButton = androidFactory.createButton();
        androidButton.display();

        // 使用iOS风格工厂创建按钮
        UIFactory iosFactory = new IOSUIFactory();
        Button iosButton = iosFactory.createButton();
        iosButton.display();
    }
}

打印:

显示安卓风格按钮
显示iOS风格按钮

🤦‍♀️此时的你: emm… 和工厂方法模式有一点不同了,但是从示例代码看上去区别不是很大吗,还是没搞懂。

🤦‍♂️我: 再来个示例吧,保证你豁然开朗✨

拓展示例:加入更多的产品

定义新的抽象产品

// 抽象产品:文本框接口
public interface TextBox {
    void display();
}

定义新的具体产品

// 具体产品:安卓风格文本框
public class AndroidTextBox implements TextBox {
    @Override
    public void display() {
        System.out.println("显示安卓风格文本框");
    }
}

// 具体产品:iOS风格文本框
public class IOSTextBox implements TextBox {
    @Override
    public void display() {
        System.out.println("显示iOS风格文本框");
    }
}

更新抽象工厂接口

// 抽象工厂:UI组件工厂
public interface UIFactory {
    Button createButton();
    TextBox createTextBox();
}

更新具体工厂

// 具体工厂:安卓风格UI组件工厂
public class AndroidUIFactory implements UIFactory {
    @Override
    public Button createButton() {
        return new AndroidButton();
    }

    @Override
    public TextBox createTextBox() {
        return new AndroidTextBox();
    }
}

// 具体工厂:iOS风格UI组件工厂
public class IOSUIFactory implements UIFactory {
    @Override
    public Button createButton() {
        return new IOSButton();
    }

    @Override
    public TextBox createTextBox() {
        return new IOSTextBox();
    }
}

调用

public class Client {
    public static void main(String[] args) {
        // 使用安卓风格工厂创建UI组件
        UIFactory androidFactory = new AndroidUIFactory();
        Button androidButton = androidFactory.createButton();
        TextBox androidTextBox = androidFactory.createTextBox();
        androidButton.display();
        androidTextBox.display();

        // 使用iOS风格工厂创建UI组件
        UIFactory iosFactory = new IOSUIFactory();
        Button iosButton = iosFactory.createButton();
        TextBox iosTextBox = iosFactory.createTextBox();
        iosButton.display();
        iosTextBox.display();
    }
}

打印

显示安卓风格按钮
显示安卓风格文本框
显示iOS风格按钮
显示iOS风格文本框

🤦‍♂️我: 这下区别更大了吧!他们的区别就在于:抽象工厂模式用于创建多个产品族的对象。每个具体工厂都能生产一整组相关的产品。
工厂方法模式用于创建一种产品,但由子类决定要实例化的具体产品。

🤦‍♀️你: 搜嘎 搜嘎,看来还是有区别的嘛😆

🤦‍♂️我: 思维发散一下,在安卓中不同的系统主题有其对应的UI控件风格,你猜猜它使用的是什么设计模式…

6.优缺点


优点:

  • 分离了具体的产品实现和客户端代码,客户端通过抽象接口操作具体产品。
  • 符合开闭原则,易于扩展,增加新的产品族很方便。

缺点:

  • 增加新的产品等级结构比较复杂,需要修改抽象工厂及所有的具体工厂。

7.应用场景


  1. 需要创建一系列相关或依赖的对象:例如,创建跨平台的UI组件(按钮、文本框等),每个平台都有一套相应的实现。
  2. 系统的产品族设计:例如,创建不同主题的UI组件(暗黑主题、明亮主题等),确保组件的一致性。
  3. 客户端不需要知道具体产品的创建细节:例如,通过配置文件决定使用哪个具体工厂。

🤔一般应用场景都是大型项目上,实现起来略复杂,我还是喜欢简单工厂模式,哈哈哈

8.总结


抽象工厂模式是一种创建型设计模式,它允许客户端创建一系列相关或相互依赖的对象,而无需指定它们具体的类。通过定义一组抽象产品接口和相应的具体工厂,系统能够灵活地支持多种产品族,并且保证产品族的一致性。尽管这种模式增加了系统的复杂性,但它在需要创建相关对象集的场景中非常有用。

还是那句话:选择适合自己程序的设计模式,不要为了设计而设计!

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

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

相关文章

vue3 - vue项目自动检测更新

GitHub Demo 地址 在线预览 web项目当页面检测到需要更新,然后弹框提示是否更新(刷新页面)这种可以通过纯前端实现也可以通过接口实现 接口实现:通过调用接口轮询和本地的版本号比较,检查是否需要弹框提示更新纯前端实…

RAFT RAG GraphRAG

解读人类语言真实意图是一门不完美的学问。相关搜索是一个认知迷宫,即使是最先进的 AI 也无法(完全)解决! # RAG Retrieval-Augmented Generation # Retrieval Augmented FineTuning(RAFT) RAFT的核心思想是结合监督式微调&#…

云WAF | 云waf保护你的网络安全

随着时代的发展,云计算与网络安全成为当今社会的热点问题。由于网络环境的日益复杂,网络安全问题日益突出,网络安全问题日益突出。近年来,各类网络安全工具与技术层出不穷,以保障用户信息及企业财产安全。云服务防火墙…

机器学习——决策树(笔记)

目录 一、认识决策树 1. 介绍 2. 决策树生成过程 二、sklearn中的决策树 1. tree.DecisionTreeClassifier(分类树) (1)模型基本参数 (2)模型属性 (3)接口 2. tree.Decision…

289个地级市-资源型城市划分数据

资源型城市:经济地理的独特现象与可持续发展的挑战 资源型城市是指那些以丰富的自然资源为基础,对国家经济和工业化进程有着重要影响的城市。这些城市在国家现代化建设中扮演着关键角色,其发展状况直接关系到区域经济的繁荣与社会的稳定。 资…

Go-知识测试-模糊测试

Go-知识测试-模糊测试 1. 定义2. 例子3. 数据结构4. tesing.F.Add5. 模糊测试的执行6. testing.InternalFuzzTarget7. testing.runFuzzing8. testing.fRunner9. FuzzXyz10. RunFuzzWorker11. CoordinateFuzzing12. 总结 建议先看:https://blog.csdn.net/a1879272183…

GitHub连接超时问题 Recv failure: Connection was reset

用手机热点WIF拉取git项目的时候,遇到Recv failure: Connection was reset问题。 解决办法 一、手动开启本地代理 二、在终端(cmd)输入命令 git config --global http.proxy http://127.0.0.1:7890 git config --global https.proxy https:…

QT实现自定义带有提示信息的透明环形进度条

1. 概述 做界面开发的童鞋可能都会遇到这样的需求,就是有一些界面点击了之后比较耗时的操作,需要界面给出一个环形进度条的进度反馈信息. 如何来实现这样的需求呢,话不多说,上效果 透明进度条 2. 代码实现 waitfeedbackprogressba…

2006-2021年 291个地级市资源错配指数、劳动和资本相对扭曲指数do文件和结果

资源错配指数:衡量生产要素配置效率的关键指标 资源错配指数(Misallocation Index)是一个衡量资源配置效率的指标,它反映了生产要素是否得到了合理配置,以及是否达到了生产效率的最优状态。一个较高的资源错配指数意味…

three-tile: 一个开源的轻量级三维瓦片库

three-tile 介绍 three-tile 是一个开源的轻量级三维瓦片库,它基于threejs使用typescript开发,提供一个三维地形模型,能轻松给你的应用增加三维瓦片地图。 https://blog.csdn.net/HZGJF/article/details/140280844 源码:https:/…

malloc与free函数的用法(精简全面 · 一看即懂)

前言:Hello大家好😘,我是心跳sy,今天为大家带来malloc函数与free函数的用法,我们一起来看看吧! 目录 一、malloc函数 💫 1、⭐️malloc函数对应的头文件⭐️ 2、⭐️malloc函数的作用⭐️ 3…

高职计算机网络实训室

一、高职计算机网络实训室建设的背景 如今,数字化发展已成为国家发展的战略方向,是推动社会进步和经济发展的重要动力。在这一时代背景下,计算机网络技术作为数字化发展的基础设施,其地位和作用愈发凸显。因此,高职院…

Windows中nvm的安装配置和卸载

文章目录 Windows中安装配置,和卸载nvm一、卸载node二、安装vnm三、配置环境(配置路径和下载源)四、使用nvm安装node五、nvm常见的命令六、nvm的卸载 Windows中安装配置,和卸载nvm 一、卸载node 如果没有node可以直接了跳过该步…

<数据集>Udacity交通目标识别数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:13239张(实际有15000张,但其中1761张无标签的图片被我去除掉) 标注数量(xml文件个数):13239 标注数量(txt文件个数):13239 标注类别数:11 标注…

全开源TikTok跨境商城源码/TikTok内嵌商城+搭建教程/前端uniapp+后端

多语言跨境电商外贸商城 TikTok内嵌商城,商家入驻一键铺货一键提货 全开源完美运营 海外版抖音TikTok商城系统源码,TikToK内嵌商城,跨境商城系统源码 接在tiktok里面的商城。tiktok内嵌,也可单独分开出来当独立站运营 二十一种…

Tomcat下载安装配置教程(零基础超详细)

「作者简介」:冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础著作 《网络安全自学教程》,适合基础薄弱的同学系统化的学习网络安全,用最短的时间掌握最核心的技术。 Tomcat 1、下载…

Docker 镜像构建报 exec xxx.sh: no such file or directory

问题记录 场景: 处于对nacos docker 部署最新版本的探究,但是nacos/nacos-server镜像拉取不到最新版本,官网也是给出自己构建镜像的方案。 具体步骤很简单,先clone项目,然后签出你要的nacos版本,通过docke…

Java——IO流(二)-(7/7):补充知识:IO框架(什么是框架、什么是IO框架、Commons-io)

目录 什么是框架 什么是IO框架 Commons-io 常用方法 框架下载 框架导入 实例演示 什么是框架 解决某类问题,编写的一套类、接口等,可以理解成一个半成品,大多框架都是第三方研发的。好处:在框架的基础上开发,可…

edge 学习工具包 math solver

简介 推荐微软推出的学习工具中的两项工具:数学求解器和 pdf 阅读器。 打开 edge 学习工具包的方法 :右上角三点-更多工具-学习工具包。 math solver 除了基础的计算求解外,还用图标展示公式,清晰直观。 地址:求解…

Vue 中的 scoped 和 /deep/ 深度选择器

Vue在组件里写 css 给 <style> 标签加上 scoped &#xff0c;比如&#xff1a; <style lang"less" scoped> &#xff0c;这样的 css 就是局部的&#xff0c;不会影响其他组件。 假设引入了一个子组件&#xff0c;并希望在组件中修改子组件的样式&#x…