概述
文章目录
- 一、简单工厂模式
- 1.if else/switch case
- 2.反射
- 二、工厂方法模式
- 三、抽象工厂模式
- 四、Spring IOC
一、简单工厂模式
简单工厂模式是指由一个工厂类对象决定创建哪一种产品类的实例,简单工厂模式适用于工厂类负责创建的对象较少的场景。
简单工厂模式类图:
简单工厂模式的实现方式:
1.if else/switch case
其实简单工厂模式的这种写法,就和我们平时代码中的根据不同的参数情况,创建不同的对象几乎相同,看下面代码:
创建动物接口:
创建不同的动物实现动物接口:
创建了一个动物工厂,根据传入的参数(想要创建的动物名),创建不同的动物:
测试代码,调用create()静态方法,传入想要创建的动物名
:
2.反射
使用 if else 会产生大量的冗余代码,在每次添加新的动物时,都要修改AnimalFactory
里面的业务代码,不符合开闭原则(对修改关闭,对扩展开放),可以使用反射进行优化。
将create()
方法进行重载,使用反射技术:
缺点:工厂类的职责相对过重,不易于扩展过于复杂的产品结构(比如每个动物的创建逻辑有区别)
二、工厂方法模式
工厂方法模式是指定义一个创建对象的接口,让实现这个接口的类来决定实例化那个类,工厂方法模式让类的实例化推迟到子类中进行。工厂方法模式主要解决产品扩展的问题。在简单工厂模式中,随着产品链的丰富,如果每个动物的创建逻辑有区别,则工厂的职责会越来越多,并不符合单一职责原则。
工厂方法模式类图:
还是为动物创建工厂,首先定义一个动物工厂的接口:
分别为 Cat、Dog 创建对应的工厂:
测试代码,为每个动物创建不同的工厂:
工厂方法模式适用于:
- 创建对象需要大量的重复代码;
- 客户端不依赖于产品类实例如何被创建、如何被实现等细节;
- 一个类通过其子类来指定创建哪个对象;
缺点:
- 类的个数容易过多,增加复杂性
三、抽象工厂模式
抽象工厂模式是指提供了一个创建一系列相关或相互依赖对象的接口,无需指定他们的具体类。
简单理解:对于一个动物工厂,不但可以创建动物,还可以创建动物的衣服、动物的食物等等,创建出来的动物、衣服、食物就可以理解为一个产品族,而针对每一个动物相当于不同的产品等级结构。看下图进一步理解一下:
抽象工厂模式类图:
还是实现动物的创建工厂,在产品等级中增加两个产品:Clothes 衣服、Food 食物:
创建抽象工厂类:
分别创建 Cat 产品族和 Dog 产品族:
分别创建 Cat 产品族和 Dog 产品族具体的工厂:
测试代码,调用动物工厂创建不同的产品:
如果细心的话,可以发现,其实工厂方法模式就是产品族只有一个产品的抽象工厂模式,可以算是特殊的抽象工厂模式。
在抽象工厂中如果需要扩展一个产品等级,比如在加一个创建动物的代步工具,那么代码从抽象工厂到具体工厂都要调整,很显然不符合开闭原则。
抽象工厂模式的缺点:
- 规定了所有可能被创建的产品等级集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口;
四、Spring IOC
Spring IOC 是对上面三种工厂模式的升级,解决了可扩展的问题,是一种比较完美的工厂模式。
IOC(控制反转):把原来的代码里需要实现的对象创建、依赖,反转给容器来帮忙实现。我们需要创建一个具体的容器(BeanFactory),同时需要一种描述来让容器知道要创建的对象与对象的关系(BeanDefinition)。
在 Spring IOC 中通过配置文件的方式,将需要创建的对象进行配置。在 Spring 运行刷新容器时,会通过 BeanDefinitionReader
去配置文件中读取需要创建的对象 Bean,并将对象的相关配置信息读取出来,封装为 BeanDefinition
并注册到容器。
其他类获取某个 Bean,通过容器的getBean()
方法就会直接获取到。
这里博主自己实现了一个简易的 Spring 框架,GitHub 地址:
mini_SpringFrame
Spring IOC 具体代码可以查看MNApplicationContext.refresh()
方法的前三步:
最后
以上就是孤独煎饼为你收集整理的Java设计模式之工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式、Spring IOC)的全部内容,希望文章能够帮你解决Java设计模式之工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式、Spring IOC)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复