一、简单工厂模式

简单工厂的定义:提供一个创建对象实例的功能,而无须关心其具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体的类

实现汽车接口

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的三种工厂模式相关推荐

  1. 安卓蓝牙键盘切换输入法_采用国产机械轴,三种连接模式轻松切换,TT G521上手体验...

    之前我用过三模游戏鼠标,也用过三模薄膜键盘,但是三模机械键盘,还是第一次使用.机械键盘,相信大家都知道,现在已经很普及了,估计当时把机械键盘重新带回到玩家当中的大神,也没有想到它会这么火爆吧.至于什么 ...

  2. python编程模式是什么_python 开发的三种运行模式详细介绍

    Python 三种运行模式 Python作为一门脚本语言,使用的范围很广.有的同学用来算法开发,有的用来验证逻辑,还有的作为胶水语言,用它来粘合整个系统的流程.不管怎么说,怎么使用python既取决于 ...

  3. Java虚拟机不能满足_深入理解Java虚拟机--读书笔记1/3

    <深入理解Java虚拟机-JVM高级特性与最佳实践> Chap 2 Java内存区域与内存溢出异常 1.Java运行时数据区域 A.程序计数器:当前线程所执行字节码的行号指示器,线程私有( ...

  4. 深入理解Java虚拟机知乎_深入理解Java虚拟机(类文件结构)

    深入理解Java虚拟机(类文件结构) 欢迎关注微信公众号:BaronTalk,获取更多精彩好文! 之前在阅读 ASM 文档时,对于已编译类的结构.方法描述符.访问标志.ACC_PUBLIC.ACC_P ...

  5. java调用子系统代码_深入理解JAVA虚拟机-Idea远程执行本地Java代码 - Java 技术驿站-Java 技术驿站...

    今天在看深入理解JAVA虚拟机的9.3节,作者实现了一个远程执行功能.这个功能可以在远程服务器中临时执行一段程序代码,而去不依赖jdk版本,不改变原有服务端程序的部署,不依赖任何第三方库,不入侵原有的 ...

  6. java虚引用作用_深入理解Java中的引用(二)——强软弱虚引用

    深入理解Java中的引用(二)--强软弱虚引用 在上一篇文章中介绍了Java的Reference类,本篇文章介绍他的四个子类:强引用.软引用.弱引用.虚引用. 强引用(StrongReference) ...

  7. java 接口和虚构_深入理解Java的接口和抽象类

    深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...

  8. java虚拟机编译顺序_深入理解Java虚拟机(程序编译与代码优化)

    文章首发于微信公众号:BaronTalk,欢迎关注! 对于性能和效率的追求一直是程序开发中永恒不变的宗旨,除了我们自己在编码过程中要充分考虑代码的性能和效率,虚拟机在编译阶段也会对代码进行优化.本文就 ...

  9. java抽象类的属性_深入理解Java抽象类

    基础部分内容差不多讲解完了,今天开始进入Java提高篇部分,这部分内容会比之前的内容复杂很多,希望大家做好心理准备,看不懂的部分可以多看两遍,仍不理解的部分那一定是我讲的不够生动,记得留言提醒我. 好 ...

  10. Java实现中国式排名_统计中国式排名的三种方法,一定有一个适合你

    引言:什么是中国式排名 看到题目,可能有些朋友会产生一个疑问,什么是中国式排名?通过一个例子来看看: C列是使用了RANK函数得到的名次,RANK函数的用法很简单:=RANK(要排名的数据,参加排名的 ...

最新文章

  1. starrocks问题小结
  2. vue如何使用原生js写动画效果_手摸手,带你用 vue 动画实现原生 app 切换效果,丝滑般的体验...
  3. kuka机器人焊接飞溅大_机器人专用三维焊接平台低温现象得到解决
  4. WebRTC系列之音频的那些事
  5. 一次经典的tcp三次握手
  6. SQL_drop删除表、数据库
  7. mysql获取多张表中的数据_mysql之多表查询
  8. MatConvnet工具箱文档翻译理解三
  9. OpenCV-特征提取与检测(04、亚像素级别角点检测)
  10. 怎么看待小公司的规章制度?
  11. 海归王垠 V.S. 阿里P10赵海平,不对等面试所引起的争议
  12. Google Play 上架总结(二)Google账户关联详解
  13. 小猫爪:i.MX RT1050学习笔记26-RT1xxx系列的FlexCAN详解
  14. 股票量化分析工具QTYX使用攻略——均线系统多头排列选股(更新2.5.7)
  15. 移动互联时代的O2O营销革命
  16. lotus 扇区一致性检测 删除错误扇区
  17. 调整B站视频播放速度
  18. html圣诞快乐英文,圣诞节快乐的英文 圣诞快乐英文单词
  19. 【教育照明无频闪调光方案】调光线性度好 调光频率1K以上都兼容 LED护眼教室黑板灯降压恒流驱动IC芯片FP7195
  20. 解读物联网在空气监测方面的应用场景及行业痛点

热门文章

  1. 系统设计知识:面向对象设计方法介绍
  2. 苹果台式电脑怎么开机_龙华苹果电脑回收公司,台式电脑回收公司电话
  3. java制定年月日第几天_(JAVA)输入年月日,计算日期是今年的第几天?
  4. 小程序内嵌h5页面分享_微信小程序webview内页面分享
  5. 综合时如何插入scan_三综合环境试验箱维修时如何做出正确判断?
  6. Maven,在pom.xml配置JDK 9版本。
  7. shields 徽标_符号,标志,文字标记:徽标类型的综合指南
  8. FPGA设计者的5项基本功
  9. activemq 安全连接
  10. PHP下操作Linux消息队列完成进程间通信的方法