简介

工厂模式(Factory Pattern)是创建对象的最佳方式之一,也是Java中最常见的涉及涉及模式之一。它定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。工厂模式也是spring中用的最多的模式之一,spring IOC用的就是工厂模式

工厂模式基本的结构优缺点介绍

优点

1. 解耦合,很大程度上降低了耦合性。

2. 调用者无需知道具体实现流程,只需关注产品最终接口。

3. 扩展性得到提高,如果想新增产品,只要工厂类就可实现。

4.解决对象创建时的繁琐问题,使得所有类可以统一创建。

缺点:每增加一个产品,都会增加具体类和实现工厂,如此一来使得类的个数过量增加,最终导致增加了系统的复杂度,加大了开发量。

设计实例

工厂模式总体思想是利用工厂类创建各种实例,以减轻创建类的复杂程度,围绕这一主题,工厂模式也有很多变种,目前最流行的有三种:简单工程模式、普通工厂模式、抽象工厂模式,本章将介绍简单工厂模式和普通工厂模式,抽象工厂模式后面单独介绍本章暂不涉及

简单工厂模式

顾名思义,就是用最简单的方式实现的工厂模式,这个模式虽然实现简单、原理简单,但是却很有用,spring的bean加载机制用的就是这种模式

下面以以创建Animal接口的两个实现类的实例为例

1> 先创建Animal接口,这个接口非常简单,只有一个eat()方法

什么是工厂设计模式(23种设计模式之------工厂模式)(1)

Animal接口

2> 分别创建Animal接口的两个实现类Dog和Cat

什么是工厂设计模式(23种设计模式之------工厂模式)(2)

Dog类实现Animal接口

什么是工厂设计模式(23种设计模式之------工厂模式)(3)

Cat类实现Animal接口

3> 创建工厂模式的核心类----工厂类,这个类中定义一个创建所有对象核心方法createBean,在这个方法中,一反射的方式创建需要创建的类(spring有的就是这个原理)

什么是工厂设计模式(23种设计模式之------工厂模式)(4)

工厂类

SimpleBeanFactory中核心方法是creatBean,里面只传了一个key(这个key必须在上面的classMap中做过注册),然后从classMap中获取对应的class,利用反射的方式创建出实例,并返回即可。

4> 看看测试代码

什么是工厂设计模式(23种设计模式之------工厂模式)(5)

测试类

我是一只小花猫,我要吃猫粮。。。。。。

我是一只小花狗,我要吃狗粮。。。。。。

总结:简单工厂模式最核心的就是“简单工厂”四个字,即:只需要一个工厂类就可以实例化所有需要的类。

普通工厂模式

普通工厂模式就要先看看简单工厂模式的缺点:简单工厂模式中,所有的需要实例化的类,都要实现Aimal接口,而且所有的产品都必须在工厂类中注册过,如果添加新产品,就必须修改工厂类,这使得类的创建过分依赖共产类,容易出错

普通工厂模式是针对每一个或一类对象创建一个工厂,对象的创建不会过分依赖工厂

1> 先定义两个接口Car、Animal,这两个接口代表两类产品的抽象,这两类产品将分别使用两个工厂类进行创建

什么是工厂设计模式(23种设计模式之------工厂模式)(6)

Animal接口

什么是工厂设计模式(23种设计模式之------工厂模式)(7)

Car接口

2> 定义以上接口的实现类Dog、BMWCar,这两个类将分别被实例化

什么是工厂设计模式(23种设计模式之------工厂模式)(8)

Dog类实现Animal接口

什么是工厂设计模式(23种设计模式之------工厂模式)(9)

BMWCar实现Car接口

3> 分别定义两个类的工厂AnimalBeanFactory、CarBeanFactory,分别用于实例化接口Animal和接口Car的子类

什么是工厂设计模式(23种设计模式之------工厂模式)(10)

AnimalBeanFactory用于实例化Animal的实现类

什么是工厂设计模式(23种设计模式之------工厂模式)(11)

CarBeanFactory用于实例化Car的实现类

4> 下面看看测试代码

什么是工厂设计模式(23种设计模式之------工厂模式)(12)

我是一只小花猫,我要吃猫粮。。。。。。

我是一辆宝马车,我正行驶在高速公路上。。。。。。

总结:工厂模式可以说是简单工厂模式的进一步抽象和拓展,在保留了简单工厂的封装优点的同时,让扩展变得简单,让继承变得可行,增加了多态性的体现。它的设计更加符合开闭原则,新增一种产品时,只需要增加相应的具体产品类和相应的工厂子类即可。符合单一职责原则,每个具体工厂类只负责创建对应的产品。

创作不易,转载请声明,如有疑问、意见或者建议,请在下方的评论区留言。

,