抽象工厂模式(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,一经查实,立即删除!

相关文章

cocos creator人开发小游戏免费素材资源

1、首先熟悉官方的手册和api文档,文档还是比较详细,游戏的方方面面都涉及到了 官方手册: http://docs.cocos.com/creator/manual/zh/官方api文档: http://docs.cocos.com/creator/api/zh/官方论坛: https://forum.coco…

AI提示工程指南

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

Python数据处理 ——展现Pandas 的强大

一、简介 Pandas是一个基于NumPy的分析结构化数据的工具集,NumPy为其提供了高性能的数据处理能力。Pandas被普遍用于数据挖掘和数据分析,同时也提供数据清洗、数据I/O、数据可视化等辅助功能。Pandas不仅简洁,还拥有出众的数据处理能力和完备…

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…

采用intellij idea作为IDE的java项目由于*.iml文件导致无法编译问题

将项目中所有的iml文件删除,然后idea重新打开项目、编译,问题解决。 从git上将spring boot项目下载,用intellij idea打开,结果无法编译,提示“程序包com.fasterxml.jackson.core不存在”。编译来编译去,又…

口语化描述Maven的依赖范围(scope),简略不详细

文章目录 一、compile(默认范围)二、test(用于测试)三、provide四、import(用来管理依赖版本)五、system六、runtime版本仲裁 一、compile(默认范围) 范围最大哪里都能用 二、test…

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采样数…

【PostgreSQL】约束-排他约束

【PostgreSQL】约束链接 检查 唯一 主键 外键 排他 排他约束 排他约束是一种数据库约束,用于确保某一列或多个列中的值在每一条记录中都是唯一的。这意味着任何两条记录都不能具有相同的值。 排他约束可以在数据库中创建唯一索引或唯一约束来实现。当尝试插入或更…

CTFHub | 存储型

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

SQLServer性能优化分析--执行计划、耗时SQL排查和死锁处理

目录 1 常用系统存储过程2 查看执行计划3 查看磁盘使用率(STATISTICS IO)4 查询时间耗时较长的语句5 死锁处理 1 常用系统存储过程 1.1 查询表结构 EXEC sp_columns your_table, column_name table_column1.2 查询表索引 EXEC sp_helpindex your_tab…

linux usb 驱动之创urb的创建和销毁

struct urb 结构在驱动中必须不被静态创建, 或者在另一个结构中, 因为这可能破坏 USB 核心给 urb 使用的引用计数方法. 它必须使用对 usb_alloc_urb 函数的调用而被创 建. 这个函数有这个原型: struct urb *usb_alloc_urb(int iso_packets, int mem_flags); 第一个参数, iso_pa…

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

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

偌依 项目部署及上线步骤

准备实验环境,准备3台机器 1.作为前端服务器,mysql,redis服务器--同时临时作为代码打包服务器 192.168.2.65 nginx-server 2.作为后端服务器 192.168.2.66 java-server-1 192.168.2.67 java-server-2 安装nginx/mysql #安装nginx [rootweb-nginx ~]…

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

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

webrtc报文记录

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