设计模式(十三)抽象工厂模式

请直接看原文:
设计模式(十三)抽象工厂模式_抽象工厂模式告诉我们,要针对接口而不是实现进行设计。( )-CSDN博客

-------------------------------------------------------------------------------------------------------------------------------- 

前言

此前讲解过简单工厂模式和工厂模式,这一篇我们来学习工厂系列的最后一个模式抽象工厂模式,建议在阅读此文前,请先阅读设计模式(四)简单工厂模式、设计模式(十)工厂方法模式这两篇文章。

抽象工厂模式定义

抽象工厂模式可以说是是工厂方法模式的升级版,当需要创建的产品有多个产品线(产品族)时使用抽象工厂模式是比较好的选择。那什么是多个产品线呢?拿我们在设计模式(四)简单工厂模式、设计模式(十)工厂方法模式中学习的生产电脑的例子来举例,我们一直都是生产联想和惠普的电脑,但是电脑也有多个产品线:台式机、笔记本和平板等等,联想和惠普都在生产这些不同产品线上的电脑,使用工厂方法模式已经满足不了需求,这一篇文章我们就用抽象工厂模式来解决这一问题。

抽象工厂模式定义
为创建一组相关或者相互依赖的对象提供一个接口,而无需指定它们的具体类。

抽象工厂模式UML图
这里写图片描述

在抽象工厂模式中有如下角色:
- AbstractFactory:抽象工厂,它声明了用来创建不同产品的方法。
- ConcreteFactory:具体工厂,实现抽象工厂中定义的创建产品的方法。
- AbstractProduct:抽象产品,为每种产品声明业务方法。比如上图的AbstractProductA和 AbstractProductB。
- ConcreteProduct:具体产品,定义具体工厂生产的具体产品,并实现抽象产品中定义的业务方法。

抽象工厂模式简单实现

联想和惠普生产的电脑分为了两个产品线,一个台式机,一个是笔记本。为了解决增加产品线的问题,我们用抽象工厂模式来进行实现。

抽象产品
首先定义抽象产品类:

public abstract class DesktopComputer {public abstract void start();
}
public abstract class NotebookComputer {public abstract void start();
}

两个抽象产品类分别为DesktopComputer和NotebookComputer ,用来定义两个产品线:台式机和笔记本。它们都定义了start方法,用来启动电脑。
具体产品
具体产品为联想和惠普旗下的台式机和笔记本,如下所示。

public class LenovoDesktopComputer extends DesktopComputer {@Overridepublic void start() {System.out.println("联想台式电脑启动");}
}public class HpDesktopComputer extends DesktopComputer {@Overridepublic void start() {System.out.println("惠普台式电脑启动");}
}public class LenovoNotebookComputer extends NotebookComputer {@Overridepublic void start() {System.out.println("联想笔记本电脑启动");}
}
public class HpNotebookComputer extends NotebookComputer {@Overridepublic void start() {System.out.println("惠普笔记本电脑启动");}
}

抽象工厂
接着创建生产电脑的抽象工厂,如下所示,

public abstract class ComputerFactory {public abstract DesktopComputer createDesktopComputer();public abstract NotebookComputer createNotebookComputer();
}

定义了两个方法,分别用来生产台式电脑和笔记本电脑。

具体工厂
定义联想和惠普工厂:

public class LenovoFactory extends ComputerFactory {@Overridepublic DesktopComputer createDesktopComputer() {return new LenovoDesktopComputer();}@Overridepublic NotebookComputer createNotebookComputer() {return new LenovoNotebookComputer();}
}public class HpFactory extends ComputerFactory {@Overridepublic DesktopComputer createDesktopComputer() {return new HpDesktopComputer();}@Overridepublic NotebookComputer createNotebookComputer() {return new HpNotebookComputer();}
}

联想工厂和惠普工厂用来生产台式机和笔记本这两个不同产品线的电脑。

客户端调用
最后编写客户端:

public class Client {public static void main(String[]args) {ComputerFactory lenocoFactory=new LenovoFactory();lenocoFactory.createDesktopComputer().start();lenocoFactory.createNotebookComputer().start();ComputerFactory hpFactory=new HpFactory();hpFactory.createDesktopComputer().start();hpFactory.createNotebookComputer().start();}
}

分别用LenovoFactory和HpFactory生产台式和笔记本电脑,并调用start方法启动它们。
运行结果为:
联想台式电脑启动
联想笔记本电脑启动
惠普台式电脑启动
惠普笔记本电脑启动

接下来给出这个例子的UML图,更便于理解,如下所示。
这里写图片描述

抽象工厂模式的优缺点

优点
具体类的创建实例过程与客户端分离,客户端通过工厂的抽象接口操纵实例,客户端并不知道具体的实现是谁。

缺点
如果增加新的产品族则也需要修改抽象工厂和所有的具体工厂。

抽象工厂模式的使用场景
  • 一个系统不依赖于产品线实例如何被创建、组合和表达的细节。
  • 系统中有多于一个的产品线,而每次只使用其中某一产品线。
  • 一个产品线(或是一组没有任何关系的对象)拥有相同的约束。

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

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

相关文章

系统架构设计文档模版

XX 系统架构设计方案 修订记录 日期 版本号 修订说明 修订人 审核人 1、概述... 5 1.1.业务背景... 5 1.2.系统总体描述... 5 1.3.系统边界图... 5 1.4.名词和缩略语... 5 1.…

live555源码学习(1)

1 基础组件 live项目主要包含了四个基础库、程序入口类(mediaServer)和测试程序(testProgs)。四个基础库是UsageEnvironment、BasicUsageEnvironment、groupsock和liveMedia UsageEnvironment 抽象了两个类UsageEnvironment和T…

力扣hot5---双指针

题目: 解决方案:双指针 指针 i 指向最左侧,指针 j 指向最右侧。此时在宽度上达到了最大值,那么哪个柱子更矮,哪个柱子向内部移动,知道 i 与 j 相遇。为什么呢? 如果哪个哪个柱子更矮&#xff0c…

代码随想录算法训练营第四十一天|198.打家劫舍,213.打家劫舍II,337.打家劫舍III

系列文章目录 代码随想录算法训练营第一天|数组理论基础,704. 二分查找,27. 移除元素 代码随想录算法训练营第二天|977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II 代码随想录算法训练营第三天|链表理论基础&#xff…

Node.js基础---模块化

基本概念 模块化 模块化是指解决一个复杂问题时,自上向下逐层把系统划分成若干模块的过程,对于整个系统来说,模块是可组合,分解和更换的单元 遵守固定规则,把大文件拆分成独立并互相依赖的多个小模块 好处&#xff1a…

【计算机毕业设计】208基于SSM的在线教育网站

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

OLLAMA:如何像专业人士一样运行本地语言模型

原文 https://cheatsheet.md/llm-leaderboard/ollama.en简介:揭示 OLLAMA 对本地语言模型的强大功能 您是否曾经发现自己陷入了基于云的语言模型网络中,渴望获得更本地化、更具成本效益的解决方案?好吧,您的搜索到此结束。欢迎来…

逆向案例四、进阶,爬取精灵数据咨询前五十页数据

python代码示例: import csv import execjs import requests f open(精灵数据.csv,w,encodingutf-8,newline) csv_writer csv.DictWriter(f,fieldnames[标题,发布时间,新闻来源,详情页链接,转自,点击量,新闻作者,发布时间小时,]) csv_writer.writeheader() data [] for pa…

【Ansys Fluent Web 】全新用户界面支持访问大规模多GPU CFD仿真

基于Web的技术将释放云计算的强大功能,加速CFD仿真,从而减少对硬件资源的依赖。 主要亮点 ✔ 使用Ansys Fluent Web用户界面™(UI),用户可通过任何设备与云端运行的仿真进行远程交互 ✔ 该界面通过利用多GPU和云计算功…

理解python3中的回调函数

百度百科说:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用&#…

Sqli-labs靶场第13关详解[Sqli-labs-less-13]

Sqli-labs-Less-13 #手工注入 post传参了 根据题目看,像一个登录页面,尝试使用布尔型盲注测试能否登录网站 1. Username输入a 测试是否会有报错,burp抓包 报错:syntax to use near a) and password() LIMIT 0,1 at line 1 分…

[python] `json.dumps()` TypeError: Object of type set is not JSON serializable

在Python中,当你尝试将一个集合(set)类型的对象转换为JSON格式时,可能会遇到“TypeError: Object of type set is not JSON serializable”的错误。这是因为标准的JSON格式不支持Python中的集合类型,JSON格式支持的数据…

【04】C语言括号匹配问题

欢迎来到土土的博客~🥳🥳🌹🌹🌹 💥个人主页:大耳朵土土垚的博客 💥 所属专栏:C语言系列函数实现 题目描述: 给定一个只包括 ‘(’,‘)’&#xf…

加密隧道技术

在现在的互联网上传输数据,首要考虑的就是安全。这关乎到你的隐私,个人信息,财产安全等等重大问题。如果你的程序本身传输的信息没有加密,也可以通过其他辅助方式让你的通信加密。一些工具的就是为了解决这样的场景的,…

之前续写抖音开发者接入字节小游戏的缓存一下,现在说一下在 Windows 或者 Mac 如何用终端更换路径?

window: 比方说你的 window 目录下是这个路径: 第一:E:\project\Q1\trunk\client\src,然后你想切换到下一个路径的话,你可以这样子操作: 第二:E:\project\Q1\trunk\client\src> cd .\usersetting 然后回车,这里不会计较大小写 第三:你就可以在这个目录下执行你的脚本:E:…

学习大数据,所必需的java基础(7)

文章目录 File类File 的静态成员File的构造方法File的获取方法相对路径和绝对路径File的创建方法File类中的删除方法File的遍历方法 字节流IO流介绍以及输入输出以及流向的介绍IO流的流向IO流分类IO流分类 OutputStream中的子类FileOutoutStream的介绍以及方法的简单介绍InputS…

服务器中如何检查端口是否开放

有多种方法可以检测服务器端口是否开放。以下是一些常用的方法: 1. Telnet 命令: 使用 Telnet 命令来测试端口的可达性。在命令提示符或终端中执行以下命令: telnet your_server_ip your_port_number 如果连接成功,表示端口是…

C++ //练习 10.22 重写统计长度小于等于6 的单词数量的程序,使用函数代替lambda。

C Primer(第5版) 练习 10.22 练习 10.22 重写统计长度小于等于6 的单词数量的程序,使用函数代替lambda。 环境:Linux Ubuntu(云服务器) 工具:vim 代码块 /********************************…

PDF标准详解(二)——PDF 对象

上一篇文章我们介绍了一个PDF文档应该包含的最基本的结构,并且手写了一个最简单的 “Hello World” 的PDF文档。后面我们介绍新的PDF标准给出示例时将以这个文档为基础,而不再给出完整的文档示例,小伙伴想自己测试可以根据上一节的文档来进行…

分布式ID选型对比(3)

redis自增 一, 引入依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>2.6.5</version> </dependency> 二, 配置信息: spring:redis:# 地…