zl程序教程

您现在的位置是:首页 >  后端

当前栏目

漫谈模式之简单工厂和工厂方法模式

方法模式 简单 工厂 漫谈
2023-06-13 09:17:24 时间

今天我们来分享工厂模式的简单工厂和工厂方法。在平时的应用开发中,工厂模式是比较常用的一个设计模式,基本上在很多的开源jar中可以看到工厂设计模式的影子。

工厂模式有以下几种形态:

  • 简单工厂(Simple Factory)模式:又称静态工厂方法模式。
  • 工厂方法(Factory Method)模式:又称多态性工厂(Polymorphic Factory)模式
  • 抽象工厂(Abstract Fcatory)模式:又称工具箱(Kit或者Toolkit)模式。

简单工厂模式的基本介绍

简单工厂模式就是由一个工厂类根据传入的参数决定创建出哪一个产品类的实例。

下面我们就以文档导入使用不同的文件处理器来简单说明一下:

导入文件处理器

此处写了接口了,抽象类也可以

具体类型的文件处理器

Excel处理

Csv处理

工厂类

工厂类根据文件后缀来决定创建什么文件处理器。

  • 后缀为csv,则返回Csv处理器
  • 后缀为xls,则返回Excel处理器
  • ... ...

Client

客户端调用示例:

执行结果:

Excel导入文件处理... ...
Csv导入文件处理... ...

这样一个简单工厂的示例就完成了。

简单工厂模式特点

优点:

将创建实例的工作与使用实例的工作分开,使用者不必关心类对象如何创建,实现了解耦。把初始化实例时的工作放到工厂里进行,使代码更容易维护。更符合面向对象的原则 & 面向接口编程,而不是面向实现编程。

缺点:

简单工厂模式的核心工厂类,这个类集中了所有的产品创建逻辑,需要判断在什么时候创建某种产品,当有新的产品需要增加的时候,不得不修改这个核心工厂类的代码

如上述示例中,再增加一个Pdf的文件处理器类PdfHandler,就需要在工厂类中增加判断逻辑,如:

另外,简单工厂模式由于使用了静态工厂方法,静态方法不能被继承和重写,会造成工厂角色无法形成基于继承的等级结构。

上述提到问题,将在工厂方法模式(Factory Method)中得到解决,接下来,一起来看下工厂方法模式。

工厂方法模式的基本介绍

意图

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

结构

工厂方法模式的基本结构如下:

这里涉及到的参与者有如下几种:

  • 抽象工厂(Creator)角色
    • 声明工厂方法,该方法返回一个Product类型的对象。可
    • 可以调用工厂方法以创建一个Product对象。
  • 具体工厂(ConcreteCreator)角色
    • 实现抽象工厂接口,返回一个ConcreteProduct对象
  • 抽象产品(Product)角色
    • 产品对象共同的父类或共同拥有的接口。
  • 具体产品(ConcreteProduct)角色
    • 实现抽象产品定义的接口。工厂方法模式所创建的每一个对象都是某个具体产品角色的实例。

工厂方法模式的示例

接下来我们来简单调整一下上述代码,采用工厂方法的模式进行展开。

导入文件处理器

此处写了接口了,抽象类也可以。customized()方法是预留的,先可以忽略。

具体的导入文件处理器

Excel文件处理器

Csv文件处理器

抽象工厂(Creator)

本文使用接口代替了。

具体工厂

Excel文件处理器工厂

Csv文件处理器工厂

Client

运行一下:

Excel导入文件处理... ...
CSV导入文件处理... ...

至此,一个简单的工厂方法模式示例就完成了。

再来看下,对新增加产品如pdf处理器,我们需要做什么呢?

1、新建文件处理器PdfHandler

2、新建一个Pdf创建工厂,用于创建PdfHandler

然后,客户端调用只要:

由此可见:

加入一个新的产品,那么就是向系统中加入这个产品类以及它对应的工厂类。没有必要修改客户端,也没有必要修改抽象工厂角色或者其他已有的具体工厂角色。对于增加新的产品类而言,这个系统完全支持开闭原则。

四. 工厂方法模式小结

简单工厂模式 vs 工厂方法模式

  • 工厂模式和简单工厂模式在结构上的不同是很明显的。工厂方法模式的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。工厂方法模式可以允许很多具体工厂类从抽象工厂类中将创建行为继承下来,从而可以成为多个简单工厂模式的综合,进而推广了简单工厂模式。
  • 加入一个新的产品,在工厂方法模式中没有必要修改客户端,也没有必要修改抽象工厂角色或者其他已有的具体工厂角色。对于增加新的产品类而言,这个系统完全支持开闭原则。而简单工厂模式则需要对核心的工厂类增加判断语句以支持新加入的产品。

工厂方法模式针对的是一个产品等级结构(此处为导入文件处理器)。

如果需要面对多个产品等级结构(再导入的同时,增加导出文件处理器),怎么办呢?我们在下一篇博文中进行讲解。