1.工厂模式能解决啥问题?
我们考虑这个问题的时候就说明我们其实已经了解了工厂模式,我们想要知道工厂模式的具体应用场景,并灵活的在工作中使用它来提供工作效率。
1.1 复习工厂模式
工厂模式具体分为:
-
简单工厂:将创建一类对象的细节(new的过程)封装在一个类(工厂类)中,外界只需要通过这个工厂类根据特定的参数就能直接获取想要的对象。
-
工厂方法模式:定义一个创建对象的接口,由其子类来决定要实例化的类是哪一个,工厂方法模式将实例化延迟到子类中。
-
抽象工厂模式:提供一个接口,用于创建相关对象或依赖对象的家族,而不需要明确指定具体类。通过依赖注入来降低耦合。
下面我们来根据具体的UML图对这三个具体的工厂模式进行复习。
1.1.1 简单工厂模式
看不懂的同学请点击跳转 => 工厂模式
将创建一类对象的细节(new的过程)封装在一个类(工厂类)中,外界只需要通过这个工厂类根据特定的参数就能直接获取想要的对象。
下面我们根据这句话来解析上面的UML图中的信息,使其一一对应起来:
上面的UML中的工厂类是PizzaFacotory,在这个类里封装了对具体的CheesePizza,GreekPizza实体类的创建。
PizzaStore就是外界,在PizzaStore中,只需要根据特定的参数type调用PizzaFacotory的getPizza就能获得相应的对象,而无需进行new。
1.1.2 工厂方法模式
看不懂的同学请点击跳转 => 工厂模式
定义一个创建对象的接口,由其子类来决定要实例化的类是哪一个,工厂方法模式将实例化延迟到子类中。
其中PizzaFactory就是一个创建对象的接口,由NYPizzaFactory,ChicagoPizzaFactory,CaliforniaPizzaFactory这些继承PizzaFactory的子类来决定具体实例化那个实体类。
1.1.3 抽象工厂模式
看不懂的同学请点击跳转 => 抽象工厂模式
- 提供一个接口用于创建相关依赖或依赖对象的家族,而不需要明确指定具体类。通过依赖注入来降低耦合。
首先,将Pizza抽象化,并且建立一个PizzaFactory接口将具体的Pizza工厂和具体的Pizza解耦(通过依赖注入相关联),然后建立一个抽象PizzaStore将具体的Store和具体的Pizza解耦,和具体的PizzaFactory解耦。
1.2 我们在项目中哪里会用到工厂模式呢?
其实如果我们稍稍留意一下,就会发现当我们使用Spring的WebApplicationContext.getBean(beanName);根据bean名称获取实例的方式,用的就是工厂模式实现的。
在Spring项目中,工厂模式大致的运行思路是:
首先在系统初始化时实例化所有的Bean类,将其实例放到BeanFactory中或者将其new的方式放入Factory中,我们在编写代码时,不用去new某个Bean,而根据BeanName或Type调用BeanFactory就能得到具体类的实例化对象。
这样做就能将业务代码和具体的Bean解耦。
比如我们写一个通用查询接口,这个接口能通过入参中查询类型参数的取值不同而能查询到不同的数据。
我们可以先写出针对不同查询的查询组件,然后在配置文件中配置查询类型参数取值和具体的查询组件的映射关系,这样我们就可以完成业务代码和Bean的解耦,查询接口具体执行那种查询是根据配置的映射关系到对象工厂中获取对象执行,然后将结果返回。
所以工厂模式的应用场景有: 在某种业务场景下,我们只需要在一类对象中获取一个对象进行使用时,我们可以使用工厂模式将创建的过程聚合在某个地方方便管理。