三、创建型模式——工厂方法模式

news2024/9/20 1:22:16

   微信公众号转载,关注微信公众号掌握更多技术动态

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

注意工厂方法模式中工厂的方法不是静态的

简单工厂模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了开-闭原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到工厂方法模式,创建一个工厂接口和创建多个工厂实现类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。

一、具体案例演示

1.产品接口

public interface Sender {  
     public void Send();
 }  

2.具体实现类

public class MailSender implements Sender {  
    @Override  
     public void Send() {  
       System.out.println("this is mailsender!");  
    }  
 }  
public class SmsSender implements Sender {  
   
     @Override  
     public void Send() {  
       System.out.println("this is sms sender!");  
     }  
 }  

3.工厂接口+工厂方法类

public interface Provider {  
     public Sender produce();  
}  
  
 public class SendMailFactory implements Provider {  
       
   @Override  
    public Sender produce(){  
        return new MailSender();  
    }  
 }  


public class SendSmsFactory implements Provider{  
  
   @Override  
    public Sender produce() {  
        return new SmsSender();  
    }  
}  

4.客户端代码

public class Client {
	 private static Provider p1,p2;
	 private static Sender s1,s2;
	 public static void main(String[] args) {
		p1 = new SendMailFactory();
		s1 = p1.produce();
		p2 = new SendSmsFactory();
		s2 = p2.produce();
	}	
}

客户端持有工厂接口类型静态变量,而实际类型是具体工厂类,然后客户端调用具体工厂类对象的创建具体产品的方法

工厂方法模式和简单工厂模式

1.工厂方法模式通过创建工厂接口的实现类工厂 解决了简单工厂模式如果想要拓展程序,必须对工厂类进行修改的问题。(如果要扩展工厂类,只要再写一个工厂接口的实现类就可以了)

2.如果一个系统确定只用到一个工厂,我们选择使用静态工厂模式

二、Java语言中工厂方法模式的例子

1.Iterable就是具体类的接口,接口中的 iterator()就是工厂方法,而Collection的实现类就是具体的工厂类

这是ArrayList中的iterator()方法可以看出来,它就是一个工厂方法,返还一个具体的Iterator类

COM、EJB、JMS框架中都用到了工厂方法模式

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

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

相关文章

luttuce(RedisTempate)实现hash expire lua脚本

话不多说先放脚本: local argv ARGV local length #argv if length > 0 then local unpackArgs {} for i 1, length - 1 dotable.insert(unpackArgs, argv[i]) end if redis.call(exists, KEYS[1]) 1 thenredis.call(del, KEYS[1])redis.call(hset, KEYS[…

程序员自由创业周记#16:备案和十月收支

程序员自由创业周记#16:备案和十月收支 政策 众所周知,从今年9月26日开始,新App必须在工信部备案获得备案号才能在Apple Store上架,之前上架的App需要在24年3月31之前完成备案。消息一出,国内独立开发者纷纷嚷着要出海…

Java版企业电子招标采购系统源码—鸿鹄电子招投标系统-企业战略布局下的采购寻源

项目说明 随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以及审…

【STM32】USART串口协议

1 通信接口 通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统 通信协议:制定通信的规则,通信双方按照协议规则进行数据收发 USRT:TX是数据发送引脚,RX是数据接受引脚; I2C&#xf…

基于SSM的高校疫情管理系统设计与实现论文

摘 要 当下疫情不容松懈,此次新冠肺炎疫情是传播速度最快、感染范围最广、防控难度最大的一次重大突发公共卫生事件,疫情防控尤为重要,传统的基于纸质文本的疫情信息管理模式,效率低,无法满足管理需求,所以…

node-sass@4.14.1 postinstall: `node scripts/build.js`

遇到一个前端项目安装node-sass依赖的问题:node-sass4.14.1 postinstall: node scripts/build.js 提供一个解决思路: 1、把package.json中node-sass这一行删掉 2、Terminal中执行 npm i node-sass -D 重新安装 3、package.json中会新增一个匹配当前n…

椋鸟C语言笔记#26:数据在内存中的存储(大小端字节序)、浮点数的存储(IEEE754)

萌新的学习笔记,写错了恳请斧正。 目录 大小端字节序 什么是大小端 写一个判断大小端的程序 浮点数在内存中的存储(IEEE 754规则) 引入 存储规则解释 读取规则解释 1.阶码不全为0或全为1(规格化数) 2.阶码全为…

代码随想录27期|Python|Day15|二叉树|层序遍历|对称二叉树|翻转二叉树

本文图片来源:代码随想录 层序遍历(图论中的广度优先遍历) 这一部分有10道题,全部可以套用相同的层序遍历方法,但是需要在每一层进行处理或者修改。 102. 二叉树的层序遍历 - 力扣(LeetCode) 层…

root登录提示:Access denied

一、问题: 在使用xshell工具用root账号登录服务器时提示Access denied,拒绝访问,SSH服务器拒绝了密码,但用其它用户又可以连接. 二、原因 是因为sshd的设置不允许root用户用密码远程登录的问题 三、解决办法 使用可以登录的账…

Parade Series - Message Interaction

if (true) {Swal.fire("节目发布", "发布完毕", "success");event.preventDefault(); } if (false) {Swal.fire("节目发布", "发布失败", "error");event.preventDefault(); }if (true) {for (var i 0; i < b…

Matlab论文插图绘制模板第130期—函数曲面图

在之前的文章中&#xff0c;分享了Matlab函数折线图的绘制模板&#xff1a; 函数三维折线图&#xff1a; 函数网格曲面图&#xff1a; 进一步&#xff0c;再来分享一下函数曲面图。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;本期内容『数据代码』已上传资源群中&a…

DBCA创建RAC的过程截图

以下错误是由于配置的内存较大&#xff0c;而大页&#xff08;HugePage&#xff09;配置较小导致&#xff0c;调整大页后就好了。

Luminar Neo:超强AI图像编辑器,助力你轻松创作完美照片!

如果你是一位热爱摄影和图像编辑的人&#xff0c;那么我相信你一定会喜欢 Luminar Neo&#xff08;超强AI图像编辑器&#xff09;&#xff01;不仅仅是一款普通的图像编辑软件&#xff0c;Luminar Neo融合了人工智能技术&#xff0c;让你在编辑照片时拥有更多可能性和创意。 L…

Python小程序 - 表格数值统计

题设&#xff1a;Excel表格中&#xff0c;计算如下图所示不同颜色&#xff08;蓝、黄、桔&#xff09;单元格值&#xff1a;各颜色填涂的单元格值的总和条件&#xff1a; - Excle表格中 - 分色标记&#xff0c;单元格有值 - 开始列&#xff08;当前为D&#xff09;&#xff0c;…

基于SSM的咖啡销售系统vue论文

摘 要 现代社会是计算机技术普遍发展与应用的社会&#xff0c;甚至无网不成行&#xff0c;由此可见信息网络已经在商家活动或者人们生活中占据非常重要的地位&#xff0c;成为各行业不可割舍的重要组成。而随着网络地位的越来越突出&#xff0c;网络平台已经超越电视、报纸等传…

记一次clickhouse启动报错

clickhouse一次排错 clickhouse启动报错 报错&#xff1a; Application: Code: 210. DB::Exception: Listen [::]:8123 failed: Poco::Exception. Code: 1000, e.code() 0, DNS error: EAI: Address family for hostname not supported (version 23.3.1.2823 (official bui…

新零售ERP软件功能有哪些?新零售ERP系统哪个操作简单

新零售企业通常存在多仓库、多营销渠道、多业务模式、价格策略灵活、供应链复杂等情况&#xff0c;如何实现配送、财务、客户、订单、仓储等业务数据一体化和智能化管理&#xff0c;是不少新零售企业需要解决的难点。 随着新零售企业数量不断增多&#xff0c;行业之间的竞争也…

【Python必做100题】之第十四题(反向输出四位数)

题目&#xff1a;编写程序&#xff1a;输入一个四位整数&#xff0c;反向输出对应的四位数 思路&#xff1a;将整数转化为字符串类型&#xff0c;利用字符串的切片进行逆转输出 代码如下&#xff1a; #编写程序&#xff1a;输入一个四位整数&#xff0c;反向输出对应的四位数…

小间距LED显示屏在会议室的应用

LED显示屏作为自发光显示设备&#xff0c;在其高亮度、远观距离、高对比度和清晰度等特点的推动下&#xff0c;已经成为不可或缺的显示设备之一。随着LED显示屏厂家和整个产业链对产品的不断完善&#xff0c;小间距LED显示屏正逐渐成为会议室中的首选。那么&#xff0c;什么是细…

【深度学习】强化学习(三)强化学习的目标函数

文章目录 一、强化学习问题1、交互的对象2、强化学习的基本要素3、策略&#xff08;Policy&#xff09;4、马尔可夫决策过程5、强化学习的目标函数1. 总回报&#xff08;Return&#xff09;2. 折扣回报&#xff08;Discounted Return&#xff09;a. 折扣率b. 折扣回报的定义 3.…