工厂模式(Factory Pattern)是创建对象的最佳方式之一,也是Java中最常见的涉及涉及模式之一。它定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。工厂模式也是spring中用的最多的模式之一,spring IOC用的就是工厂模式
工厂模式基本的结构- 工厂类:实际用来创建对象的类,提供一个供外部调用的方法,用于创建类的对象,所以称之为工厂类。它是工厂模式的核心类,所有实例的内部逻辑都由它负责创建。工厂类可以直接被外界调用,用来创建实际需要实例化的对象。
- 接口或抽象类:所有需要创建的对象的父类,并描述所有实例共有的接口。比如,想创建Dog类和Cat类,那么我们就可以Animal的接口或者抽象类,Dog或者Cat类分别实现接口即可
- 产品类:工厂模式的具体需要实例化的类,它实现了我们所定义的接口或者集成了抽象类,在工厂类中初始化。
优点:
1. 解耦合,很大程度上降低了耦合性。
2. 调用者无需知道具体实现流程,只需关注产品最终接口。
3. 扩展性得到提高,如果想新增产品,只要工厂类就可实现。
4.解决对象创建时的繁琐问题,使得所有类可以统一创建。
缺点:每增加一个产品,都会增加具体类和实现工厂,如此一来使得类的个数过量增加,最终导致增加了系统的复杂度,加大了开发量。
设计实例工厂模式总体思想是利用工厂类创建各种实例,以减轻创建类的复杂程度,围绕这一主题,工厂模式也有很多变种,目前最流行的有三种:简单工程模式、普通工厂模式、抽象工厂模式,本章将介绍简单工厂模式和普通工厂模式,抽象工厂模式后面单独介绍本章暂不涉及
简单工厂模式
顾名思义,就是用最简单的方式实现的工厂模式,这个模式虽然实现简单、原理简单,但是却很有用,spring的bean加载机制用的就是这种模式
下面以以创建Animal接口的两个实现类的实例为例
1> 先创建Animal接口,这个接口非常简单,只有一个eat()方法
Animal接口
2> 分别创建Animal接口的两个实现类Dog和Cat
Dog类实现Animal接口
Cat类实现Animal接口
3> 创建工厂模式的核心类----工厂类,这个类中定义一个创建所有对象核心方法createBean,在这个方法中,一反射的方式创建需要创建的类(spring有的就是这个原理)
工厂类
SimpleBeanFactory中核心方法是creatBean,里面只传了一个key(这个key必须在上面的classMap中做过注册),然后从classMap中获取对应的class,利用反射的方式创建出实例,并返回即可。
4> 看看测试代码
测试类
我是一只小花猫,我要吃猫粮。。。。。。
我是一只小花狗,我要吃狗粮。。。。。。
总结:简单工厂模式最核心的就是“简单工厂”四个字,即:只需要一个工厂类就可以实例化所有需要的类。
普通工厂模式
普通工厂模式就要先看看简单工厂模式的缺点:简单工厂模式中,所有的需要实例化的类,都要实现Aimal接口,而且所有的产品都必须在工厂类中注册过,如果添加新产品,就必须修改工厂类,这使得类的创建过分依赖共产类,容易出错
普通工厂模式是针对每一个或一类对象创建一个工厂,对象的创建不会过分依赖工厂
1> 先定义两个接口Car、Animal,这两个接口代表两类产品的抽象,这两类产品将分别使用两个工厂类进行创建
Animal接口
Car接口
2> 定义以上接口的实现类Dog、BMWCar,这两个类将分别被实例化
Dog类实现Animal接口
BMWCar实现Car接口
3> 分别定义两个类的工厂AnimalBeanFactory、CarBeanFactory,分别用于实例化接口Animal和接口Car的子类
AnimalBeanFactory用于实例化Animal的实现类
CarBeanFactory用于实例化Car的实现类
4> 下面看看测试代码
我是一只小花猫,我要吃猫粮。。。。。。
我是一辆宝马车,我正行驶在高速公路上。。。。。。
总结:工厂模式可以说是简单工厂模式的进一步抽象和拓展,在保留了简单工厂的封装优点的同时,让扩展变得简单,让继承变得可行,增加了多态性的体现。它的设计更加符合开闭原则,新增一种产品时,只需要增加相应的具体产品类和相应的工厂子类即可。符合单一职责原则,每个具体工厂类只负责创建对应的产品。
创作不易,转载请声明,如有疑问、意见或者建议,请在下方的评论区留言。
,