设计模式 简单工厂 工厂方法模式 抽象工厂模式 Spring 工厂 BeanFactory 解析

工厂模式介绍

工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。它是创建型模式。

简单工厂

简单工厂模式是指由一个工厂对象决定创建出哪一种产品类的实例, 但它不属于GOF 23种设计模式

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

适用场景: 工厂类负责创建的对象较少 对于如何创建对象的逻辑不需要关心

优点: 只需要传入一个正确的参数 就可以获取所需要的对象 无需知道创建细节

缺点: 违背开闭原则 不易于扩展过于复杂的产品结构 新增产品需要修改工厂类的代码

以下我们用支付场景演示简单工厂用法

1.定义支付接口

/*** 支付接口** @author Lion Li*/
public interface IPay {void payment();
}

2.编写工厂实例

/*** 付款方式工厂** @author Lion Li*/
public class PayFactory {/*** 创建付款实例* Class<? extends IPay> 单一原则 限制必须是 IPay 的子类*/public IPay create(Class<? extends IPay> clazz) {if (null != clazz) {try {return clazz.newInstance();} catch (Exception e) {throw new RuntimeException(e);}}return null;}}

3.编写具体的支付类 例如: 微信 支付宝

/*** 微信支付** @author Lion Li*/
public class WxPay implements IPay {public void payment() {System.out.println("微信支付");}
}
/*** 支付宝支付** @author Lion Li*/
public class ZfbPay implements IPay {public void payment() {System.out.println("支付宝支付");}
}

4.编写测试类并运行测试

/*** @author Lion Li*/
public class Test {public static void main(String[] args) {IPay wx = new PayFactory().create(WxPay.class);IPay zfb = new PayFactory().create(ZfbPay.class);wx.payment();zfb.payment();}
}

工厂方法模式

工厂方法模式是指定义一个创建对象的接口, 但让实现这个接口的类来觉得实例化哪个类, 工厂方法让类的实例化推迟到子类中进行

适用场景: 创建对象需要大量重复的代码 不依赖于产品类实例如何被创建 实现等细节

优点: 用户只需要关心所需要产品对应的工厂 无需关心创建细节 加入新产品符合开闭原则 提供了系统的可扩展性

缺点: 类的个数容易过多 增加的代码的结构负责都 增加了系统的抽象性和理解难度

以下我们用汽车场景工厂方法模式用法

1.定义汽车接口规范

/*** 汽车接口规范** @author Lion Li*/
public interface ICar {void name();
}

2.编写汽车工厂接口规范

/*** 汽车工厂接口规范** @author Lion Li*/
public interface ICarFactory {ICar create();
}

3.编写具体的汽车种类 例如: 宝马 大众

/*** 宝马汽车** @author Lion Li*/
public class BaoMaCar implements ICar {public void name() {System.out.println("我是宝马");}
}
/*** 大众汽车** @author Lion Li*/
public class DaZhongCar implements ICar {public void name() {System.out.println("我是大众");}
}

4.编写具体的汽车工厂 例如: 宝马工厂 大众工厂

/*** 宝马汽车工厂** @author Lion Li*/
public class BaoMaCarFactory implements ICarFactory {public ICar create() {return new BaoMaCar();}
}
/*** 大众汽车工厂** @author Lion Li*/
public class DaZhongCarFactory implements ICarFactory {public ICar create() {return new DaZhongCar();}
}

5.编写测试类并运行测试

/*** @author Lion Li*/
public class Test {public static void main(String[] args){ICarFactory baomaFactory = new BaoMaCarFactory();ICar baoma = baomaFactory.create();baoma.name();ICarFactory dazhongFactory = new DaZhongCarFactory();ICar dazhong = dazhongFactory.create();dazhong.name();}}

抽象工厂

抽象工厂模式是指提供一个创建一系列相关或相互依赖对象的接口 无需指定他们具体的类

适用场景:

  1. 不依赖于产品类实例如何被创建等细节 强调一系列相关产品对象一起使用创建对象需要大量重复的代码
  2. 提供一个产品类的库 所有产品以同样的接口出现 从而不依赖于具体的实现

优点: 具体产品在应用层代码隔离 无需关心创建细节 将一个系列的产品统一到一起创建

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

以下我们用多种出行方式来演示抽象工厂用法

1.定义产品接口规范

/*** 汽车接口规范** @author Lion Li*/
public interface ICar {void name();
}
/*** 飞机接口规范** @author Lion Li*/
public interface IAircraft {void name();
}

2.定义产品工厂接口规范

/*** 汽车工厂接口规范** @author Lion Li*/
public interface ICarFactory {ICar create();
}
/*** 飞机工厂接口规范** @author Lion Li*/
public interface IAircraftFactory {IAircraft create();
}

3.定义所有产品实现

/*** 宝马汽车** @author Lion Li*/
public class BaoMaCar implements ICar {public void name() {System.out.println("我是宝马");}
}
/*** 大众汽车** @author Lion Li*/
public class DaZhongCar implements ICar {public void name() {System.out.println("我是大众");}
}
/*** 波音飞机** @author Lion Li*/
public class BoYinAircraft implements IAircraft {public void name() {System.out.println("我是波音");}
}
/*** 空客飞机** @author Lion Li*/
public class KongKeAircraft implements IAircraft {public void name() {System.out.println("我是空客");}
}

4.定义所有产品工厂实现

/*** 宝马汽车工厂** @author Lion Li*/
public class BaoMaCarFactory implements ICarFactory {public ICar create() {return new BaoMaCar();}
}
/*** 大众汽车工厂** @author Lion Li*/
public class DaZhongCarFactory implements ICarFactory {public ICar create() {return new DaZhongCar();}
}
/*** 波音飞机工厂** @author Lion Li*/
public class BoYinAircraftFactory implements IAircraftFactory {public IAircraft create() {return new BoYinAircraft();}
}
/*** 空客飞机工厂** @author Lion Li*/
public class KongKeAircraftFactory implements IAircraftFactory {public IAircraft create() {return new KongKeAircraft();}
}

5.定义交通工具抽象工厂

/*** 交通工具抽象工厂** @author Lion Li*/
public abstract class TransportationFactory {public void init() {System.out.println("初始化数据");}protected abstract ICar createCar(Class<? extends ICarFactory> clazz);protected abstract IAircraft createAircraft(Class<? extends IAircraftFactory> clazz);
}

6.定义出行方式工厂

/*** 出行方式工厂** @author Lion Li*/
public class TravelFactory extends TransportationFactory {@Overrideprotected ICar createCar(Class<? extends ICarFactory> clazz) {super.init();if (null != clazz) {try {return clazz.newInstance().create();} catch (Exception e) {throw new RuntimeException(e);}}return null;}@Overrideprotected IAircraft createAircraft(Class<? extends IAircraftFactory> clazz) {super.init();if (null != clazz) {try {return clazz.newInstance().create();} catch (Exception e) {throw new RuntimeException(e);}}return null;}
}

7.编写测试类并运行测试

/*** @author Lion Li*/
public class Test {public static void main(String[] args){TransportationFactory factory = new TravelFactory();ICar baoma = factory.createCar(BaoMaCarFactory.class);baoma.name();ICar dazhong = factory.createCar(DaZhongCarFactory.class);dazhong.name();IAircraft boyin = factory.createAircraft(BoYinAircraftFactory.class);boyin.name();IAircraft kongke = factory.createAircraft(KongKeAircraftFactory.class);kongke.name();}}

Spring 工厂 BeanFactory 解析

这里由于网上已经有很多成熟的解析文档 就不多做介绍了

推荐文章链接: Spring 的工厂模式 BeanFactory 是什么源码刨析

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

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

相关文章

网络管理员推荐的网络监控软件-OpManager

网络是企业背后的基础&#xff0c;这些网络可帮助企业将信息保存在一个集中位置&#xff0c;需要并限制所有其他入站请求的人都可以访问。那么&#xff0c;如何提供持续的一流最终用户体验并维护快速发展的网络呢&#xff1f;只有借助可靠的实时网络监控工具&#xff0c;才能监…

nodejs配置express服务器,运行自动打开浏览器

查看专栏目录 Network 灰鸽宝典专栏主要关注服务器的配置&#xff0c;前后端开发环境的配置&#xff0c;编辑器的配置&#xff0c;网络服务的配置&#xff0c;网络命令的应用与配置&#xff0c;windows常见问题的解决等。 文章目录 设置方法&#xff1a;1&#xff0c;安装nodej…

python实现一张图片按指定宽高截取成多张图片

1、导入所需的包 import os from PIL import Image 2、获取源图片 path_img image img_dir os.listdir(path_img) 3、循环读取源图片并按指定宽高进行自动截图保存 for i in range(len(img_dir)):id img_dir[i].split(.)[0]img Image.open(path_img / img_dir[i])si…

【C++高阶(七)】C++异常处理的方式

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 异常处理的方式 1. 前言2. C语言处理异常的方式…

Transformer架构详解

文章目录 引言1. Transformer架构详解1.1 编码器与解码器1.1.1 编码器&#xff08;Encoder&#xff09;1.1.2 解码器&#xff08;Decoder&#xff09; 2. 核心代码2.1 自注意力&#xff08;Self-Attention&#xff09;机制2.2 多头注意力&#xff08;Multi-Head Attention&…

Python PIP安装pycorrector、kemln报错

本来想装个pycorrector用一下&#xff0c;结果在安装其依赖包kemln的时候疯狂报错&#xff0c;报错关键词包括但不限于Bash、Cmake&#xff0c;C啥的&#xff0c;搜了很多文章&#xff0c;终于摸索到了安装的办法。 1、安装bash 去官网https://gitforwindows.org/下载bash&am…

消费者痛点怎么分析,不同行业如何营销

消费者的痛点是品牌营销中的关键因素&#xff0c;因为准确把握消费者的痛点&#xff0c;可以为品牌带来更大的市场机会。今天和大家探讨下消费者痛点怎么分析&#xff0c;不同行业如何营销&#xff1f; 今天我们会从分类、洞察、场景分析、分级与评判以及不同行业细分的角度来进…

neuq-acm预备队训练week 9 P8604 [蓝桥杯 2013 国 C] 危险系数

题目背景 抗日战争时期&#xff0c;冀中平原的地道战曾发挥重要作用。 题目限制 题目描述 地道的多个站点间有通道连接&#xff0c;形成了庞大的网络。但也有隐患&#xff0c;当敌人发现了某个站点后&#xff0c;其它站点间可能因此会失去联系。 我们来定义一个危险系数 DF…

Android动画(四)——属性动画ValueAnimator的妙用

目录 介绍 效果图 代码实现 xml文件 介绍 ValueAnimator是ObjectAnimator的父类&#xff0c;它继承自Animator。ValueAnimaotor同样提供了ofInt、ofFloat、ofObject等静态方法&#xff0c;传入的参数是动画过程的开始值、中间值、结束值来构造动画对象。可以将ValueAnimator看…

环境搭建及源码运行_java环境搭建_maven

书到用时方恨少、觉知此时要躬行&#xff1b;拥有技术&#xff0c;成就未来&#xff0c;抖音视频教学地址&#xff1a;​​​​​​​ ​​​​​​​ 1、介绍 1&#xff09;管理项目依赖和版本 统一的项目依赖和版本管理 ​​​​​​​​​​​ 2&#xff09;Maven支持多模块…

From Human Attention to Computational Attention (1)

”is the taking possession by the mind, in clear and vivid form, of one out of what seem several simultaneously possible objects or trains of thought. It implies withdrawal from some things in order to deal effectively with others“&#xff0c;William Jame…

6.任务分配与执行总体设计实现

1.设计 执行任务找一个落地场景&#xff1a;连接设备采集参数。设备有不同的协议&#xff0c;如&#xff1a;modbus rtu、modbus tcp、opc ua、simens s7等。协议多种多样&#xff0c;需要的参数也不同&#xff0c;连接及任务执行参数存放在t_job表的link_spec中&#xff0c;任…

Jenkins配置代理节点时遇到的坑和解决办法

需求&#xff1a;服务器太满了&#xff0c;需要找个比较空闲的机器分担一下&#xff0c;看上了同网络的某开会用的笔记本&#xff0c;把这个本本利用起来能跑一个算一个。 但配置起来并不容易&#xff0c;遇到的问题有些网上也几乎找不到答案。这里记录一下能救一个是一个&…

python处理数据内存不够,python处理数据安全吗

大家好&#xff0c;小编为大家解答python处理数据索引的常见方法的问题。很多人还不知道python处理数据内存不够&#xff0c;现在让我们一起来看看吧&#xff01; 学 目录 1.数据表的基本信息查看 2.查看数据表的大小 3.数据格式的查看 4、查看具体的数据分布 二、缺失值处理 …

sap table 获取 valuation class MBEW 查表获取

参考 https://www.tcodesearch.com/sap-tables/search?qvaluationclass

FastAPI访问/docs接口文档显示空白、js/css无法加载

如图&#xff1a; 原因是FastAPI的接口文档默认使用https://cdn.jsdelivr.net/npm/swagger-ui-dist5.9.0/swagger-ui.css 和https://cdn.jsdelivr.net/npm/swagger-ui-dist5.9.0/swagger-ui-bundle.js 来渲染页面&#xff0c;而这两个URL是外网的CDN&#xff0c;在国内响应超…

Text2SQL学习整理(二) WikiSQL数据集介绍

导语 上篇博客中&#xff0c;我们已经了解到Text2SQL任务的基本定义&#xff0c;本篇博客将对近年来该领域第一个大型数据集WikiSQL做简要介绍。 WikiSQL数据集概述 基本统计特性 WikiSQL数据集是一个多数据库、单表、单轮查询的Text-to-SQL数据集。它是Salesforce在2017年…

python之双链表

双链表简单讲解 双向链表&#xff08;doubly linked list&#xff09;是一种链式数据结构&#xff0c;它的每个节点包含两个指针&#xff0c;一个指向前一个节点&#xff0c;一个指向后一个节点。与单向链表相比&#xff0c;双向链表可以在任何位置进行插入和删除操作&#xf…

PDF转为图片

PDF转为图片 背景pdf展示目标效果 发展过程最终解决方案&#xff1a;python PDF转图片pdf2image注意&#xff1a;poppler 安装 背景 最近接了一项目&#xff0c;主要的需求就是本地的文联单位&#xff0c;需要做一个电子刊物阅览的网站&#xff0c;将民族的刊物发布到网站上供…

字节开源的netPoll多路复用器源码解析

字节开源的netPoll多路复用器源码解析 引言NetPollepoll API原生网络库实现netpoll 设计思路netpoll 对比 go net数据结构 源码解析多路复用池初始化Epoll相关API可读事件处理server启动accept 事件客户端连接初始化客户端连接建立 可读事件等待读取数据 可写事件处理客户端启动…