工厂模式是最基本的也是最重要的模式,因为它方便我们能写出高质量、高效率的代码。只有掌握了工厂模式,我们才不会重复造轮子。今天将从最简单的工厂模式开始一步步深入讲解,告诉大家自己写是怎么用的,框架又是如何实现,我们能从框架实现获得怎么样的灵感。

首先看看工厂模式的类图:

工厂模式由一个接口类加一个对应的工厂类实现的,接口类提供所有要创建出来的实体所需要的方法,工厂类只负责一件事:创建实现类的对象的方法。

先提供出接口类和实现类:

public interface ICar {void getBrand();
}
public class Audi implements ICar {public void getBrand() {System.out.printf("My brand is %s \n", Audi.class.getSimpleName());}
}
public class Benz implements ICar {public void getBrand() {System.out.printf("My brand is %s \n", Benz.class.getSimpleName());}
}

实现类会把类名打出来,我们现在要写个工厂类负责构造实现类的对象。

public class SimpleFactory1 {public ICar createCar(String carName){if("audi".equals(carName)){return  new Audi();} else if ("benz".equals(carName)) {return new Benz();}return null;}public static void main(String[] args) {SimpleFactory1 carFactory = new SimpleFactory1();ICar audi = carFactory.createCar("audi");audi.getBrand();ICar benz = carFactory.createCar("benz");benz.getBrand();}
}

工厂类采用的是根据传入类型判断创建哪个实体类,这种方式是实现起来很简单,有几种类型就相应的写多个if...else...分支即可。但这种工厂模式让人感觉很低能,因为每次需要增加一种类型的车辆,不仅要加相应的实体类,还要修改工厂类,明显违背了开闭原则。现在提供第二种工厂类:

public class SimpleFactory2 {public ICar createCar(Class<? extends  ICar> carClass){try {return carClass.newInstance();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}return null;}public static void main(String[] args) {SimpleFactory2 carFactory = new SimpleFactory2();ICar audi = carFactory.createCar(Audi.class);audi.getBrand();ICar benz = carFactory.createCar(Benz.class);benz.getBrand();}

第二种工厂类的实现是根据实体类的Class的类型来自动生成实例,这种方式极大了提升了程序的扩展性,后续工厂类不需要做任何更改,只要加让实体类实现ICar接口,那么就能通过工厂类生产出相应的车辆。

现在最热门的Spring框架的IOC就是基于工厂模式,IOC通过DI(依赖注入)的方式将bean的创建交给了Spring Container,Spring Container 自动帮我们创建对象,我们只需要使用即可。

下面将采用Spring提供的一些组件来实现一个简单工厂,首先原有的实体类需要做下改造,类上加了@Component注解:

@Component
public class Audi implements ICar {public void getBrand() {System.out.printf("My brand is %s \n", Audi.class.getSimpleName());}
}
public class SpringFactory {public ICar createCar(String carName){AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("com.discover.amazing.model");return (ICar) context.getBean(carName);}public static void main(String[] args) {SpringFactory springFactory = new SpringFactory();ICar carBean = springFactory.createCar("audi");carBean.getBrand();}
}

Spring 这个工厂和前面的两种实现方式有没有本质区别呢,必须有,毕竟Spring 这么强大的世界级框架能被成千上万的企业使用有其道理。前面已经提示了,Spring 框架有Spring 容器,Spring 容器在启动的时候已经创建了,所有被@Component注解标注的实体类都会被扫描到放入容器中,下次使用是直接从容器中取出对象,不会再new新的对象。

可见,理解设计模式非常重要,通过设计模式,我们才能更深入的理解各种框架,理解了框架本质和思想,才能利用框架写出高质量的代码。

工厂模式及在Spring中的应用相关推荐

  1. 工厂模式在 Calendar 类中的应用

    在前面讲到工厂模式的时候,大部分工厂类都是以 Factory 作为后缀来命名,并且工厂类主要负责创建对象这样一件事情.但在实际的项目开发中,工厂类的设计更加灵活.那我们就来看下,工厂模式在 Java ...

  2. 伪代码的简单例子_使用策略+工厂模式彻底干掉代码中的if else!

    对于业务开发来说,业务逻辑的复杂是必然的,随着业务发展,需求只会越来越复杂,为了考虑到各种各样的情况,代码中不可避免的会出现很多if-else. 一旦代码中if-else过多,就会大大的影响其可读性和 ...

  3. 工厂模式在iOS开发中的实际应用

    工厂模式 使用场景 好处 使用步骤 抽象类使用工厂方法生成具体子类,抽象类定义所有相关子类的共有的共同行为 各个具体工厂重载抽象父类工厂中定义的方法,各个子类拥有一组共同的行为,但实际实现不同 持有者 ...

  4. 简单工厂模式练习:简单工厂模式在农场系统中实现

    目录 前言 一.简单工厂模式 二.农场系统创建 1.先新建一个包.类以及抽象类 2.键入各类中代码 1 抽象产品角色  Fruit 2 实现产品角色  Apple 3实现产品角色  Grape 4实现 ...

  5. 设计模式 笔记4 | 简单工厂模式 在源码中的应用 | Calendar 日历 | 源码浅析 | 使用总结 | 建造者模式

    文章目录 一.Calendar 日历类 1.1 内部属性 1.2 设置时间属性值 1.3 获取时间属性 1.4 使用 Calander 计算时间 二.Calender 类中的设计模式 2.1 简单工厂 ...

  6. 工厂模式 java好处_java中工厂模式的优缺点有哪些

    java中工厂模式的优缺点有哪些 发布时间:2020-12-03 15:15:07 来源:亿速云 阅读:79 作者:Leah 这篇文章将为大家详细讲解有关java中工厂模式的优缺点有哪些,文章内容质量 ...

  7. 简单工厂模式-接口在设计模式中的应用之一

    接口在设计模式中的应用之一:简单工厂模式 无工厂:手工 缺点:麻烦,对每一个的要求都比较高 优点:个性化 工厂:生产产品 优点:批量生产,使用者比较方便,直接买 缺点:无法定制,如果非要定制就会比较麻 ...

  8. java设计模式工厂模式_Java中的工厂设计模式

    java设计模式工厂模式 Welcome to the Factory Design Pattern in Java tutorial. Factory Pattern is one of the C ...

  9. 浅谈Spring框架应用的设计模式(一)——工厂模式

    文章目录 前言 一.工厂模式介绍 1.简单工厂模式 (1)静态工厂模式 (2)利用反射机制实现的简单工厂 2.工厂方法模式 3.抽象工厂模式 二.Spring框架中工厂模式的重要应用 1.BeanFa ...

  10. Discuz!NT 中的数据库链接类(重构到抽象类工厂模式)

       在7月份中我曾经写过一篇随笔叫,叫" .NET2.0 框架中的 AbstractFactory 模式 " . 里面主要说了在2.0框架下的数据库链接工厂中新增的几个类,而这几 ...

最新文章

  1. c# byte char string转换
  2. linux基础(一)
  3. 【机器学习】Github8.9K,目前最佳模型解释器-LIME!
  4. LINQ体验(6)——LINQ语句之Join和Order By
  5. IOS开发基础知识--碎片8
  6. python随机划分数据集_Python之机器学习-sklearn生成随机数据
  7. DtCms.ActionLabel.Article.cs
  8. 支付宝WAP支付接口开发
  9. java获取数组穷举_递归算法求解遍历(或穷举)问题
  10. HRM人力资源系统-Day07
  11. Java打印九九乘法表
  12. ue转换文件格式linux,关于windows与unix之间文件格式转换问题。UE编辑器中(CR/LF)问题...
  13. 基于NB-IoT物联网人体红外防盗报警检测
  14. Android7.1.1 remap鼠标右键为返回键
  15. 盛大数位红 正式进军手机游戏
  16. SuperMap许可使用随手记
  17. git restore指令和git restore --staged 的使用
  18. 图像处理一大神器:图像去噪
  19. 计算机水平熟悉情况,计算机水平如何填
  20. php替换正文中的汉字,php如何实现替换汉字

热门文章

  1. office精英俱乐部_开放组织读书俱乐部:收回精英制
  2. MindManager2021下载及安装教程
  3. BTA | 厉晹Roy Li:浅谈区块链技术在企业级应用中的实践
  4. 杭电2018复试上机真题
  5. 专插本计算机二级英语四级,专插本考试需要英语四级吗?
  6. 什么是顶级域名和一级域名,如何区分
  7. 基于python爬虫下载网站在线视频
  8. 12306抢票,极限并发带来的思考?
  9. window出现msvcp100.dll缺失问题
  10. 【机器学习】简单关联分析算法-Apriori algorithm