java bean 工厂模式_深入理解Java的三种工厂模式
一、简单工厂模式
简单工厂的定义:提供一个创建对象实例的功能,而无须关心其具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体的类
实现汽车接口
public interfaceCar {
String getName();
}
奔驰类
public class Benz implementsCar {
@OverridepublicString getName() {return "Benz";
}
}
宝马类
public class BMW implementsCar {
@OverridepublicString getName() {return "BMW";
}
}
简单工厂,既能生产宝马又能生产奔驰
public classSimpleFactory {publicCar getCar(String name){if (name.equals("BMW")){return newBMW();
}else if (name.equals("benz")){return newBenz();
}else{
System.out.println("不好意思,这个品牌的汽车生产不了");return null;
}
}
}
测试类
public classSimpleFactoryTest {public static voidmain(String[] args){
SimpleFactory simpleFactory= newSimpleFactory();
Car car= simpleFactory.getCar("BMW");
System.out.println(car.getName());
}
}
测试结果
BMW
根据简单工厂的定义,用户只要产品而不在乎产品如何生产,看起来好像很完美的样子。但大家想想,这个世界存在什么都生产的工厂吗?
显然是不存在的,每一个汽车品牌都有自己的生产工厂,都有自己生产技术。映射到spring框架中,我们有很多很多种的bean需要生产,如果只依靠一个简单工厂来实现,那么我们得在工厂类中嵌套多少个if..else if啊?
而且我们在代码中生产一辆汽车只是new一下就出来了,但实际操作中却不知道需要进行多少操作,加载、注册等操作都将体现在工厂类中,那么这个类就会变得紊乱,管理起来也很不方便,所以说每个品牌应该有自己的生产类。
因为专一,所以专业嘛,这个时候工厂方法就出现了。
二、工厂方法
工厂接口
//定义一个工厂接口,功能就是生产汽车
public interfaceFactory {
Car getCar();
}
奔驰工厂
public class BenzFactory implementsFactory {
@OverridepublicCar getCar() {return newBenz();
}
}
宝马工厂
public class BMWFactory implementsFactory{
@OverridepublicCar getCar() {return newBMW();
}
}
测试类
public classFactoryTest {public static voidmain(String[] args){
Factory bmwFactory= newBMWFactory();
System.out.println(bmwFactory.getCar().getName());
Factory benzFactory= newBenzFactory();
System.out.println(benzFactory.getCar().getName());
}
}
测试结果
BMW
Benz
根据上述代码可以看出,不同品牌的汽车是由不同的工厂生产的,貌似又是很完美的。但大家看一下测试类,当一个人想要去买一辆宝马汽车的时候(假设没有销售商),那么他就要去找宝马工厂给他生产一辆,过几天又想要买一辆奔驰汽车的时候,又得跑到奔驰工厂请人生产,这无疑就增加了用户的操作复杂性。所以有没有一种方便用户操作的方法呢?这个时候抽象工厂模式就出现了。
三、抽象工厂
抽象工厂
public abstract classAbstractFactory {protected abstractCar getCar();//这段代码就是动态配置的功能//固定模式的委派
publicCar getCar(String name){if("BMW".equalsIgnoreCase(name)){return newBmwFactory().getCar();
}else if("Benz".equalsIgnoreCase(name)){return newBenzFactory().getCar();
}else if("Audi".equalsIgnoreCase(name)){return newAudiFactory().getCar();
}else{
System.out.println("这个产品产不出来");return null;
}
}
}
默认工厂
public class DefaultFactory extendsAbstractFactory {private AudiFactory defaultFactory = newAudiFactory();publicCar getCar() {returndefaultFactory.getCar();
}
}
宝马工厂
public class BMWFactory extendsAbstractFactory {
@OverridepublicCar getCar() {return newBMW();
}
}
奔驰工厂
public class BenzFactory extendsAbstractFactory {
@OverridepublicCar getCar() {return newBenz();
}
}
测试类
public classAbstractFactoryTest {public static voidmain(String[] args) {
DefaultFactory factory= newDefaultFactory();
System.out.println(factory.getCar("Benz").getName());
}
}
测试结果
Benz
根据上述代码可以看出,用户需要一辆汽车,只需要去找默认的工厂提出自己的需求(传入参数),便能得到自己想要产品,而不用根据产品去寻找不同的生产工厂,方便用户操作。
注:对于设计模式,有些人嗤之以鼻,有些人敬若神明,但我是认可的。
按我粗浅的理解,设计模式的经典之处,就在于解决了编写代码的人和调用代码的人双方的痛楚,不同的设计模式也只适用于不同的场景。至于用或者不用,如何使用,那就需要各位看官着重考虑了。
但为了使用而使用是不应该的,细微之处,只有留给大家慢慢品味了。
java bean 工厂模式_深入理解Java的三种工厂模式相关推荐
- 安卓蓝牙键盘切换输入法_采用国产机械轴,三种连接模式轻松切换,TT G521上手体验...
之前我用过三模游戏鼠标,也用过三模薄膜键盘,但是三模机械键盘,还是第一次使用.机械键盘,相信大家都知道,现在已经很普及了,估计当时把机械键盘重新带回到玩家当中的大神,也没有想到它会这么火爆吧.至于什么 ...
- python编程模式是什么_python 开发的三种运行模式详细介绍
Python 三种运行模式 Python作为一门脚本语言,使用的范围很广.有的同学用来算法开发,有的用来验证逻辑,还有的作为胶水语言,用它来粘合整个系统的流程.不管怎么说,怎么使用python既取决于 ...
- Java虚拟机不能满足_深入理解Java虚拟机--读书笔记1/3
<深入理解Java虚拟机-JVM高级特性与最佳实践> Chap 2 Java内存区域与内存溢出异常 1.Java运行时数据区域 A.程序计数器:当前线程所执行字节码的行号指示器,线程私有( ...
- 深入理解Java虚拟机知乎_深入理解Java虚拟机(类文件结构)
深入理解Java虚拟机(类文件结构) 欢迎关注微信公众号:BaronTalk,获取更多精彩好文! 之前在阅读 ASM 文档时,对于已编译类的结构.方法描述符.访问标志.ACC_PUBLIC.ACC_P ...
- java调用子系统代码_深入理解JAVA虚拟机-Idea远程执行本地Java代码 - Java 技术驿站-Java 技术驿站...
今天在看深入理解JAVA虚拟机的9.3节,作者实现了一个远程执行功能.这个功能可以在远程服务器中临时执行一段程序代码,而去不依赖jdk版本,不改变原有服务端程序的部署,不依赖任何第三方库,不入侵原有的 ...
- java虚引用作用_深入理解Java中的引用(二)——强软弱虚引用
深入理解Java中的引用(二)--强软弱虚引用 在上一篇文章中介绍了Java的Reference类,本篇文章介绍他的四个子类:强引用.软引用.弱引用.虚引用. 强引用(StrongReference) ...
- java 接口和虚构_深入理解Java的接口和抽象类
深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...
- java虚拟机编译顺序_深入理解Java虚拟机(程序编译与代码优化)
文章首发于微信公众号:BaronTalk,欢迎关注! 对于性能和效率的追求一直是程序开发中永恒不变的宗旨,除了我们自己在编码过程中要充分考虑代码的性能和效率,虚拟机在编译阶段也会对代码进行优化.本文就 ...
- java抽象类的属性_深入理解Java抽象类
基础部分内容差不多讲解完了,今天开始进入Java提高篇部分,这部分内容会比之前的内容复杂很多,希望大家做好心理准备,看不懂的部分可以多看两遍,仍不理解的部分那一定是我讲的不够生动,记得留言提醒我. 好 ...
- Java实现中国式排名_统计中国式排名的三种方法,一定有一个适合你
引言:什么是中国式排名 看到题目,可能有些朋友会产生一个疑问,什么是中国式排名?通过一个例子来看看: C列是使用了RANK函数得到的名次,RANK函数的用法很简单:=RANK(要排名的数据,参加排名的 ...
最新文章
- starrocks问题小结
- vue如何使用原生js写动画效果_手摸手,带你用 vue 动画实现原生 app 切换效果,丝滑般的体验...
- kuka机器人焊接飞溅大_机器人专用三维焊接平台低温现象得到解决
- WebRTC系列之音频的那些事
- 一次经典的tcp三次握手
- SQL_drop删除表、数据库
- mysql获取多张表中的数据_mysql之多表查询
- MatConvnet工具箱文档翻译理解三
- OpenCV-特征提取与检测(04、亚像素级别角点检测)
- 怎么看待小公司的规章制度?
- 海归王垠 V.S. 阿里P10赵海平,不对等面试所引起的争议
- Google Play 上架总结(二)Google账户关联详解
- 小猫爪:i.MX RT1050学习笔记26-RT1xxx系列的FlexCAN详解
- 股票量化分析工具QTYX使用攻略——均线系统多头排列选股(更新2.5.7)
- 移动互联时代的O2O营销革命
- lotus 扇区一致性检测 删除错误扇区
- 调整B站视频播放速度
- html圣诞快乐英文,圣诞节快乐的英文 圣诞快乐英文单词
- 【教育照明无频闪调光方案】调光线性度好 调光频率1K以上都兼容 LED护眼教室黑板灯降压恒流驱动IC芯片FP7195
- 解读物联网在空气监测方面的应用场景及行业痛点
热门文章
- 系统设计知识:面向对象设计方法介绍
- 苹果台式电脑怎么开机_龙华苹果电脑回收公司,台式电脑回收公司电话
- java制定年月日第几天_(JAVA)输入年月日,计算日期是今年的第几天?
- 小程序内嵌h5页面分享_微信小程序webview内页面分享
- 综合时如何插入scan_三综合环境试验箱维修时如何做出正确判断?
- Maven,在pom.xml配置JDK 9版本。
- shields 徽标_符号,标志,文字标记:徽标类型的综合指南
- FPGA设计者的5项基本功
- activemq 安全连接
- PHP下操作Linux消息队列完成进程间通信的方法