抽象工厂模式(Abstract Factory)

文章目录

  • 定义与类型
  • 适用场景
  • 优点
  • 缺点
  • 产品等级结构与产品族
  • 抽象工厂代码示例

定义与类型

定义:抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,无须指定它们具体的类。

类型:创建型。

适用场景

  • 客户端(应用层)不依赖于产品类实例如何被创建、实现等细节
  • 强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码
  • 提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现

优点

  • 具体产品在应用层代码隔离,无须关心创建细节
  • 将一个系列的产品族统一到一起创建

缺点

  • 规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口
  • 增加了系统的抽象性和理解难度

产品等级结构与产品族

在这里插入图片描述

横着来看,海尔洗衣机、海尔冰箱、海尔空调,它们都是海尔品牌,它们都属于海尔这个产品族。

竖着来看,海尔空调、美的空调、海信空调,它们都是空调,它们属于同一个产品等级结构。

工厂方法模式针对的就是产品等级结构,抽象工厂模式针对的就是产品族。

如下图所示,当一个工厂可以创建出分属于不同产品等级结构的一个产品族中的所有对象时,使用抽象工厂模式更为简单高效。

在这里插入图片描述

抽象工厂代码示例

在这里插入图片描述

CourseFactory.java

package com.czh.creational.abstractfactory;public interface CourseFactory {Video getVideo();Note getNote();
}

JavaCourseFactory.java

package com.czh.creational.abstractfactory;public class JavaCourseFactory implements CourseFactory {@Overridepublic Video getVideo() {return new JavaVideo();}@Overridepublic Note getNote() {return new JavaNote();}
}

PythonCourseFactory.java

package com.czh.creational.abstractfactory;public class PythonCourseFactory implements CourseFactory {@Overridepublic Video getVideo() {return new PythonVideo();}@Overridepublic Note getNote() {return new PythonNote();}
}

Video.java

package com.czh.creational.abstractfactory;public abstract class Video {public abstract void play();
}

JavaVideo.java

package com.czh.creational.abstractfactory;public class JavaVideo extends Video {@Overridepublic void play() {System.out.println("播放Java课程视频");}
}

PythonVideo.java

package com.czh.creational.abstractfactory;public class PythonVideo extends Video {@Overridepublic void play() {System.out.println("播放Python课程视频");}
}

Note.java

package com.czh.creational.abstractfactory;public abstract class Note {public abstract void read();
}

JavaNote.java

package com.czh.creational.abstractfactory;public class JavaNote extends Note {@Overridepublic void read() {System.out.println("阅读Java课程笔记");}
}

PythonNote.java

package com.czh.creational.abstractfactory;public class PythonNote extends Note {@Overridepublic void read() {System.out.println("阅读Python课程笔记");}
}

Test.java

package com.czh.creational.abstractfactory;public class Test {public static void main(String[] args) {CourseFactory courseFactory1 = new JavaCourseFactory();Video video1 = courseFactory1.getVideo();Note note1 = courseFactory1.getNote();video1.play();note1.read();CourseFactory courseFactory2 = new PythonCourseFactory();Video video2 = courseFactory2.getVideo();Note note2 = courseFactory2.getNote();video2.play();note2.read();}
}

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

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

相关文章

AI提示工程指南

简述: 当今互联网行业对于AI提示工程的需求日益增长,而《AI提示工程指南》是一本旨在满足这种需求的宝贵指南。本指南由一位对AI提示工程充满热情并自学而来的互联网从业者撰写,旨在为行业人员提供一个全面、易懂的参考手册。 这本指南将引领您踏上AI提示工程的旅程,深入探…

DevOps(3)

目录 11.描述root账户? 12.如何在发出命令时打开命令提示符? 14.Linux系统下交换分区的典型大小是多少? 15.什么是符号链接? 11.描述root账户? root账户就像一个系统管理员账户,允许你完全控制系统。 …

经常戴耳机有什么危害呢?一文读懂长时间使用耳机都有哪些危害

经常佩戴耳机可能会出现滋生细菌、引起炎症反应、损伤听力等危害。 1、滋生细菌:长时间戴耳机,会导致耳道堵塞,从而导致耳内潮湿,容易滋生细菌。 2、引起炎症反应:长时间戴耳机,会对耳道口造成机械性的压…

多线程和JVM

一,多线程实现的四种方式 1. 实现Runnable接口 普通实现: public class MyRunnable implements Runnable {Overridepublic void run() {System.out.println("线程执行中...");} }public class Main {public static void main(String[] arg…

vmware workstation的三种网络模式通俗理解

一、前言 workstations想必很多童鞋都在用,经常会用来在本机创建不同的虚拟机来做各种测试,那么对于它支持的网络模式,在不同的测试场景下应该用哪种网络模式,你需要做下了解,以便可以愉快的继续测(搬&…

全年重磅!《2023年度TikTok电商行业趋势白皮书》发布!

2023年,似乎所有的东西都往相反的方向发展。疫情消退后经济没有明朗,局部冲突愈演愈烈没有消停,打工人辛苦工作工资没有涨,疯狂买买买的双十一也开始变得冷清... 似乎是不友好的一年,那你有听到“增长的声音”吗&…

uniCloud 云函数

相对于云函数,官方更推荐使用 云对象 新建云函数 编辑云函数 uniCloud-aliyun/cloudfunctions/hello_func/index.js use strict; exports.main async (event, context) > {let {name} eventreturn 你好,${name}! };云函数接收的参数从event中解构获…

ARM+FPGA多通道信号采集与处理模块开发方案

多通道信号采集与处理模块开发方案 开发一套多通道光电信号采集与处理模块,实现对64通道传感信号采集、处理与存储功能。主要包括数据采集与处理电路,系统控制软件,信号处理算法实现及数据存储。其中包括8通道ADC,每一路ADC采样数…

CTFHub | 存储型

0x00 前言 CTFHub 专注网络安全、信息安全、白帽子技术的在线学习,实训平台。提供优质的赛事及学习服务,拥有完善的题目环境及配套 writeup ,降低 CTF 学习入门门槛,快速帮助选手成长,跟随主流比赛潮流。 0x01 题目描述…

js逆向第9例:猿人学第2题-js混淆-动态cookie1

题目2:提取全部5页发布日热度的值,计算所有值的加和,并提交答案 (感谢蔡老板为本题提供混淆方案) 既然题目已经给出了cookie问题,那就从cookie入手,控制台找到数据请求地址 可以看到如下加密字符串m类似md5,后面跟着时间戳 m=45cc41dcdb15159ebb50564635f8e362|1704301…

智能视频监控技术在旅游业中如何发挥最大作用,助力旅游业发展

随着“南方小土豆勇闯哈尔滨”的词条霸榜热搜,大众旅游热情再次点燃。最近哈尔滨游客爆满的情况,极易发生游客迷路、景区瘫痪、交通堵塞等情况,当地有关部门的压力不言而喻。对于节假日或者“破天富贵”、“报复性旅游”的情况,景…

webrtc报文记录

tcp.port 10443 || tcp.port 6080 || udp.port 8000 https://download.csdn.net/download/dualvencsdn/88706745

如何使用ArcGIS Pro转换单个点坐标

坐标转换作为基础的功能,一般的GIS软件都支持,大多数情况下,我们是转换整个图层,如果想要转换单个坐标点,在ArcGIS Pro内也是支持的,这里为大家介绍一下转换方法,希望能对你有所帮助。 拾取坐标…

IPv6路由协议---IPv6静态路由

IPv6路由协议 路由是数据通信网络中最基本的要素。路由信息就是知道报文发送的路径信息,路由的过程就是报文转发的过程。 根据路由目的地的不同,路由可划分: 1.网段路由:目的地为网段,IPv4地址子网掩码长度小于32位或IPv6地址前缀长度小于128位。 2.主机路由:目的地为主…

Python爬虫实战技巧:如何在爬取过程中动态切换代理IP

目录 前言 第一步:获取代理IP列表 第二步:测试代理IP的可用性 第三步:动态切换代理IP 总结 前言 在进行爬虫开发的过程中,有时候需要使用代理IP来访问目标网站,以避免被封IP或者降低访问频率的限制。本文将介绍如…

Zabbix自定义监控内容实验(带自动报警)

实验前准备 zabbix服务端:192.168.188.17 zabbix客户端:192.168.188.11 部署zabbix服务端(192.168.188.17) zabbix-server 内存至少2G,推荐4G (1) 关闭防火墙 systemctl stop firewalld setenforce 0 (2)获取zabbix下…

第五周:深度学习知识点回顾

前言: 讲真,复习这块我是比较头大的,之前的线代、高数、概率论、西瓜书、樱花书、NG的系列课程、李宏毅李沐等等等等…那可是花了三年学习佳实践下来的,现在一想脑子里就剩下几个名词就觉得废柴一个了,朋友们有没有同感…

web学习笔记(九)

目录 1.初识JS(JavaScript) 1.1什么是JavaScript? 1.2HTML5 CSS3 javaScript三者的关系 1.3 JAVAScript的作用 1.4JAVAScript的组成部分 1.5JS注释 1.6补充知识 2.JS的引入方法 2.1行内式 2.2嵌入式(内嵌式) 2.3外链式 3.输入和…

Linux--系统安全及应用

1.1账号安全控制 用户账号是计算机使用者的身份凭证或标识,每个要访问系统资源的人,必须凭借其用户账号才能进入计算机。在Linux系统中,提供了多种机制来确保用户账号的正当、安全使用。 1.系统账号清理 在Linux系统中,除了用户手…

ChatGPT绘制全球植被类型分布图、生物量图、土壤概念图、处理遥感数据并绘图、病毒、植物、动物细胞结构图

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮,可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…