什么是工厂模式:工厂模式其实就是封装了创建对象的过程,通过提供统一的接口来创建对象,这样能够隐藏对象的具体实现细节,提高灵活性,封装性;
用生活中的例子来说:
你去饭店吃饭,服务员就是工厂模式的接口,顾客是客户端,厨师是具体的类;
不使用工厂模式:你直接跟厨师说你要吃什么菜,也就是直接new对象,这样操作的耦合度非常高,并且代码不易维护;
使用工厂模式:叫来服务员跟他说你要吃什么,然后服务员再返回给你需要的东西,这样你就能通过服务员获取到你想吃的菜,并且代码经过封装,代码无论是封装性,可读性,维护性都相对更高;
作用:
- 将对象的创建逻辑与使用代码分离,使得使用代码不需要关心对象具体如何创建,说白了就是解耦;
- 提供了一种简单的扩张机制,使得新增功能时不需要修改原有的代码,直接扩展工厂类就可以了,提高代码的可维护性;
- 直接调用接口就可以进行操作,提高代码可读性;
总结来说就是:解耦,易于维护,封装性,可读性
应用环境:
- 当创建对象的过程非常复杂时,需要多个步骤才能完成,那么我们就可以用工厂模式将其封装起来,使客户端的代码变得简单;
- 当系统中的类存在大量的重复代码用来创建对象时,可以使用工厂模式来减少重复代码;
实现方式:
简单工厂模式:定义一个工厂类,根据传入的参数判断需要创建哪个具体的对象。最简单的工厂模式实现方式,但是会造成工厂类的职责过重,当需要新增产品的时候需要修改工厂类源码;
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。这样能够实现很好的解耦,因为添加新的产品类时,不需要修改现有的工厂类,而是通过增加新的子类实现;
抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。这种方式更加全面,适合对工厂模式依赖性很强的系统;
模式的本质:
工厂模式的本质其实就是封装,通过将对象的创建过程封装在一个独立的工厂类中,客户端也不需要关注具体的创建细节,只需要通过工厂类提供的接口来获取对象,这样即使对象的创建过程发生变化,也不会影响到客户端代码从而提高系统的可维护性和可扩展性;
缺点:
其实我个人觉得一但牵扯到封装,比如cloud模块,面向对象,工厂模式,都会有一个通病,就是不适于一些小型规模的场景,比如cloud架构对于一些小型应用,可能主要功能就那么几个,也就不需要强行变成微服务架构了,面向对象,比如有一个工具类它只需要做一件事,本身也就只有一个接口,那么使用封装可能还会使代码变得臃肿,而工厂模式,假如说你为了一部分复杂的对象创建过程使用工厂模式,那么整个系统的复杂度也会增加,导致过度设计,也就是为了一碟醋而包了一顿饺子;