(1)是什么---概念
简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
(2)为什么---产生动机
当我们需要使用一个对象时,通常只需要通过关键字 new ,就可以得到一个实例,为什么还需要通过简单工厂这么繁琐的方式创建对象呢?
举例说明:
正常模式下,我需要一个苹果,我需要创建一个苹果的对象,并操作对象获得苹果,当我想要一个香蕉的时候要需要创建一个香蕉的对象,并操作它获取香蕉,同理,我想要获取其他的水果,都需要先创建一个对象,然后获得。这样对象在很多地方进行使用,那么大量相同且繁琐的处理逻辑,会扩散到项目各个地方;
因此,工厂模式产生了,当你需要什么,只需要传入一个正确地参数,就能获取你所需要的对象,无需了解怎么样创建对象。
如图所示:当想要苹果的时候直接在农场中进行获取苹果就OK,不需要亲自去苹果园进行采摘。
模式结构:
(a)抽象角色:简单工厂模式所创建所有对象的父类,它负责描述所有实例所有的公共接口;例如:Fruit类
(b)工厂角色:简单工厂模式的核心,他负责实现创建所有实力的内部逻辑,工厂类可以被外界直接调用,创建所需的产品对象;FruitFactory类
(c)具体产品角色:简单工厂模式所创建的具体实例对象;具体产品类例如:苹果,香蕉等
(3)怎么做---功能说明和代码实现
代码逻辑结构如下图所示,通过工厂类中得方法传入想要得类型,就可以获得相应地实例类。
具体实现参照github库源码,地址如下:
https://github.com/zhaoyan1990/designModel
(4)解决问题
a.简化对象的使用
b.简化冗余逻辑
c.减少重复代码
(5)使用场景
当需要根据一定的逻辑,创建一个抽象接口的一系统对象时;
前提条件:
抽象接口的实现类不应太多,而且种类固定(不会随着时间变化而增加),否则,简单工厂方法中的if else判断会越来越多,越来越复杂;而且还需要不断修改工厂方法,这违背了“开闭原则”;
例如:jdbc连接,
计算机运算池,
jdk中的NumberFormat,根据Local,返回适合当地类型的NumberFormat对象;
private static NumberFormat getInstance(Locale desiredLocale, int choice);
(6)总结
综上所述,简单工厂模式理论上觉得很合理,但实际上不可能存在一个工厂能生产所有的东西,例如每种水果的培育方式都不一样。映射到spring框架中,我们有很多很多种的bean需要生产,如果只依靠一个简单工厂来实现,那么我们得在工厂类中嵌套多少个if..else if啊?因此,请关注工厂模式!!!