设计模式之~工厂系列

目录

简单工厂模式

工厂方法模式

简单工厂 VS 工厂方法

抽象工厂模式:

拓展:

利用简单工厂模式优化抽象工厂  

利用反射+抽象工厂   进行优化

反射+配置文件+抽象工厂进行优化


简单工厂模式

优点:简单工厂模式的最大优点在于工厂类包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类。对与客户端来说去除了与具体产品的依赖。

缺点:违背开发-封闭原则(每增加一个功能类,都要在工厂方法里加逻辑判断)

适用场景:简单工厂适用于工厂类负责创建的对象较少的场景,且客户端只需要传入工厂类的参数,对于如何创建对象的逻辑不需要关心。

结构图:

实例:(简单工厂和功能类:依赖关系)

工厂方法模式

  • 定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

  • 在工厂方法模式中用户只需要关心所需产品对应的工厂,无须关心创建细节,而且加入新的产品符合开闭原则。

优点:

  • 工厂方法克服了简单工厂违背开放-封闭原则的缺点,又保持了封装对象创建过程的优点。

  • 封装了对象的创建,使得要更换对象时,不需要做大的改动就可实现,降低了客户程序与产品对象的耦合。

  • 工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。

缺点:

  • 类的个数容易过多,增加复杂度。(需要有多个具体工厂)

  • 增加了系统的抽象性和理解难度

适用场景:

  • 当客户程序不需要知道要使用对象的创建过程。

  • 客户程序使用的对象存在变动的可能,或者根本就不知道使用哪一个具体的对象。

结构图:

实例:

简单工厂 VS 工厂方法

  • 工厂方法模式实现时,客户端需要决定实例化哪一个工厂类(子类),选择判断的问题还是存在的。也就是说工厂方法把简单工厂的内部逻辑判断转移到了客户端代码来进行。你想要增加功能,本来是修改工厂类的,而现在是修改客户端。

  • 都集中封装了对象的创建,使得要更换对象时,不需要做大的改动就可以实现,降低了客户程序与产品对象的耦合。

抽象工厂模式:

        抽象工厂模式为创建一组对象提供了一种解决方案。 与工厂方法模式相比, 抽象工厂模式中的具体工厂不只是创建一种具体对象,它负责创建一组(族)具体对象。

优点:

  • 抽象工厂模式隔离了具体类的生成, 使得客户并不需要知道什么被创建。 由于这种隔离,更换一个具体工厂就变得相对容易,所有的具体工厂都实现了抽象工厂中定义的那些公共接口, 因此只需改变具体工厂的实例, 就可以在某种程度上改变整个软件系统的行为。

  • 当一个族中的多个对象被设计成一起工作时, 它能够保证客户端始终只使用同一个族中的对象。

  • 增加新的族很方便, 无须修改已有系统, 符合“开闭原则”。

缺点:

  • 规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂 的接口

  • 增加了系统的抽象性和理解难度。

适用场景:

系统中有多个产品族,而系统一次只可能消费其中一族产品。而这一族产品中每种产品又需要具有不同的创建方法

结构图:

实例:

拓展:

利用简单工厂模式优化抽象工厂  

package 抽象工厂模式;public class DataAccess {private static String db="Sqlserver";public static IUser CreateUser() {IUser result =null;switch(db){case"Sqlserver":result=new SqlserverUser();break;case"Access":result=new AccessUser();break;}return result;}public static IDepartment CreateDepartment() {IDepartment result =null;switch(db){case"Sqlserver":result=new SqlserverDepartment();break;case"Access":result=new AccessDepartment();break;}return result;}
}

利用反射+抽象工厂   进行优化

package 抽象工厂模式;
//不在再使用switch-case语句
public class DataAccess1 {private static String AssemblyName="抽象工厂模式";private static String db="Sqlserver";public static IUser CreateUser() throws InstantiationException, IllegalAccessException, ClassNotFoundException{String className=AssemblyName+"."+db+"User";return (IUser)Class.forName(className).newInstance();}public static IDepartment CreateDepartment() throws InstantiationException, IllegalAccessException, ClassNotFoundException{String className=AssemblyName+"."+db+"Department";return (IDepartment)Class.forName(className).newInstance();}
}

反射+配置文件+抽象工厂进行优化

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

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

相关文章

【无标题】win11打开VMware虚拟机蓝屏解决

win11打开VMware虚拟机蓝屏解决 win11打开虚拟机蓝屏!!!解决方案:win11支持16.2以上版本,其他版本不兼容,可用文末的卸载工具卸载之前已安装版本(深度卸载),然后下载16.2…

数字图像学笔记 —— 18. 图像抖动算法

文章目录 为什么需要图像抖动图像抖动算法实现的基本思路常见图像抖动算法实现Floyd-Steinberg 抖动算法Atkinson 抖动算法算法实现 为什么需要图像抖动 在数字图像中,为了表示数字图像的细节,像素的颜色深度信息最少也是8位,即 0 − 256 0…

vulhub-Jarbas(易)

打靶练习Jarbas 0x00 部署0x01 信息收集:端口扫描、服务发现0x02 路径爬取0x03 反弹shell0x04 内网信息收集0x05 crontab定时任务提权0x06 总结 0x00 部署 靶机:下载地址 宿主机:kali2021版本 0x01 信息收集:端口扫描、服务发现…

什么是先进存力?曙光存储:内铸数字底座,外成实践底气

5月26日,由DOIT联合中国电子学会共同举办的2023数据基础设施技术峰会在苏州举办。中科曙光存储产品事业部副总经理张新凤受邀参会,并在主论坛发表主题演讲,与数百位业内专业嘉宾伙伴共探存力发展未来。 什么样的存力能打造数字经济底座&#…

尚硅谷在线教育视频点播

文章目录 1. 开通阿里云视频点播服务2.阿里云点播SDK实现2.1上传视频到阿里云视频点播服务2.2整合阿里云上传视频的接口 3. 课程信息的完善(为每个课程的小节添加视频)3.1 添加上传视频3.2删除视频信息3.2.1后台3.2.2前端 1. 开通阿里云视频点播服务 选…

阿里云视频点播的使用

1.简介:视频点播(ApsaraVideo for VoD)是集音视频采集、编辑、上传、自动化转码处理、媒体资源管理、分发加速于一体的一站式音视频点播解决方案。 2.视频点播的使用: 2.1引入相关依赖:阿里云上有也可以进行直接使用 …

java red5 点播_树莓派实用RED5搭建流媒体服务器实现点播功能

1,搭建流媒体服务器一直是自己想玩的一个东西,在高中玩workerman框架时有人就做过nginx通过rtmp模块搭建流媒体服务器,nginx的特性就是高并发,轻量级,一般大型企业都会采用这个服务器,但是由于,…

Nginx 搭建RTMP视频点播 直播 HLS服务器

安装Nginx --下载nginx-rtmp-module模块 git clone https://github.com/arut/nginx-rtmp-module.git--安装依赖 yum install -y wget gcc gcc-c make pcre pcre-deve zilib zlib-devel openssl-devel--下载Nginx源码包并解压 wget http://nginx.org/download/nginx-1.18.0.tar…

阿里云视频点播

目录 1.控制台介绍 2.环境准备 3.视频上传 4.视频删除 5.获取播放地址 6.获取播放凭证 1.控制台介绍 存储小于50G免费的,转码、流量都是需要付费的 视频存储 需要配置域名 2.环境准备 需要拿到这个key和secret,配置在项目中 3.视频上传 /*** 上传…

陕西发布!陕西省重点实验室申报条件类别、认定程序要求

本文整理了陕西省重点实验室申报条件,认定材料等相关内容,感兴趣的朋友快跟小编一起来看看吧! 一、总体思路 本次省重点实验室布局建设工作以填补我省优势学科领域下无省级及以上科学与工程研究类科技创新基地的空白为主,同时兼顾前沿、新兴、…

腾讯云点播视频播放器使用步骤 uniapp

微信开发后台 首先需要微信小程序的账号,各种认证,信息填写完整, 然后–>设置–>第三方设置–>插件管理–>添加插件–>搜索云点播短视频播放器–>添加插件 项目开发 在page.json文件中的globalStyle下面加入 "usin…

用Python实现腾讯云点播VOD

腾讯云点播VOD主要用于视频资源的上传和在线播放,腾讯云官方文档也有许多相关操作的介绍,但是关于Python的文档相对较少,这里我想分享一下在Python方面自己对腾讯云VOD的研究(记得看注释)。 必备知识基础:…

阿里云视频点播-记录

1.开通视频点播 开通服务 点击立即开通 找到存储管理 启用存储地址 视频加密要设置转码并将其设置为默认 修改模板-点击编辑 上传视频测试 此时已经有了默认存储地址和默认转码配置域名加速【域名已备案】 输入域名点击提交即可配置DNS 点击眼睛并复制CNAME,前…

使用阿里云视频点播上传视频

目录 前言一、目的二、实现步骤1.准备操作2.主要使用模块2.1. 上传音频2.2. 添加转码设置 3.搭建视频点播环境3.1.配置Maven仓库3.2.添加jar依赖3.3.上传视频3.4.初始化点播服务3.5.根据视频ID获取视频地址3.6.根据视频ID删除阿里云中视频3.7.根据视频ID集合删除 三、问题1.阿里…

什么是视频点播(VOD)?

点击上方“LiveVideoStack”关注我们 翻译 | Alex 技术审校 | 赵军 本文来自OTTVerse,作者为Krishna Rao Vijayanagar。 点播 Easy Tech #012# VOD代表Video on Demand(视频点播),这种视频流化和交付技术使人们可以随时随地在任何…

php视频点播系统,PHPvod 视频点播系统 v3.1 for php5.4.x

PHPvod是一款免费开源,基于PHPMysql开发的视频点播系统,系统拥有众多的优秀功能和特性,在社区成员的积极参与下,在易用性、扩展性和性能方面不断优化和改进,使得PHPvod可以在极为繁忙的服务器环境下快速稳定运行&#…

开源的在线视频点播系统,值得分享!

平时做一些商业的项目。大家都知道,github是程序员的天堂,大家要好好利用。 今天给大家推荐的这个开源项目来自于读者的投稿,我感觉非常不错,就在这里推荐给大家,如果你也有好的开源项目,我也可以帮你推荐…

uniapp - 腾讯云点播小程序插件

欢迎关注微信公众号:FSA全栈行动 👋 一、简介 微信小程序播放教育类视频要求具备有相关资质,但这些资质一般公司很难短时间申请下来(甚至有的公司压根就申请不了),而【短视频播放器小程序插件】含有《信息…

免费视频直播、点播H5播放器SkeyeWebPlayer适配移动端

免费视频直播、点播H5播放器SkeyeWebPlayer适配排除,移动端,常见移动端Web页面问题及解决方案 SkeyeVSS其独创的ws-rtsp流媒体直播技术,兼容传统安防流媒体的同时,不需要安装浏览器插件,解决互联网接入安防监控延迟高…

JAVA在线教育视频点播学习系统毕业设计 开题报告

本文给出的java毕业设计开题报告,仅供参考!(具体模板和要求按照自己学校给的要求修改) 选题目的和意义 目的:本课题主要目标是设计并能够实现一个基于java的视频点播系统,系统整体使用了基于浏览的javaMy…