深入理解设计模式-简单工厂模式vs工厂方法模式vs抽象工厂模式对比讲解

Posted 、Dong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入理解设计模式-简单工厂模式vs工厂方法模式vs抽象工厂模式对比讲解相关的知识,希望对你有一定的参考价值。

文章目录


前言

简单工厂模式、工厂方法模式、抽象工厂模式比较相像,很多同学傻傻分不清楚,本文进行详细对比说明,建议对三个模式有一定基础再进行阅读,如不了解可查看往期文章。

一、简单工厂模式

1.描述

简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

2.特点

  • 它是一个具体的类,非接口 抽象类。有一个重要的create()方法,利用if或者switch创建产品并返回。

  • create()方法通常是静态的,所以也称之为静态工厂。

3.优缺点

缺点:

  • 扩展性差(我想增加一种面条,除了新增一个面条产品类,还需要修改工厂类方法)

  • 不同的产品需要不同额外参数的时候 不支持。

4.类图说明

Factory(工厂):核心部分,负责实现创建所有产品的内部逻辑,工厂类可以被外界直接调用,创建所需对象

Product(抽象类产品):工厂类所创建的所有对象的父类,封装了产品对象的公共方法,所有的具体产品为其子类对象

ConcreteProduct(具体产品):简单工厂模式的创建目标,所有被创建的对象都是某个具体类的实例。它要实现抽象产品中声明的抽象方法(有关抽象类)


二、工厂方法模式

1.描述

提供一个用于创建对象的接口(工厂接口),让其实现类(工厂实现类)决定实例化哪一个类(产品类),并且由该实现类创建对应类的实例。

2.特点

  • 可以一定程度上解耦,消费者和产品实现类隔离开,只依赖产品接口(抽象产品),产品实现类如何改动与消费者完全无关。

  • 可以一定程度增加扩展性,若增加一个产品实现,只需要实现产品接口,修改工厂创建产品的方法,消费者可以无感知(若消费者不关心具体产品是什么的情况)。

  • 可以一定程度增加代码的封装性、可读性。清楚的代码结构,对于消费者来说很少的代码量,就可以完成很多工作。

另外,抽象工厂才是实际意义的工厂模式,工厂方法只是抽象工厂的一个比较常见的情况。

3.适用场景

消费者不关心它所要创建对象的类(产品类)的时候。

消费者知道它所要创建对象的类(产品类),但不关心如何创建的时候。

例如:hibernate里通过sessionFactory创建session、通过代理方式生成ws客户端时,通过工厂构建报文中格式化数据的对象。

4.类图说明

提供一个产品类的接口。产品类均要实现这个接口(也可以是abstract类,即抽象产品)。

提供一个工厂类的接口。工厂类均要实现这个接口(即抽象工厂)。

由工厂实现类创建产品类的实例。工厂实现类应有一个方法,用来实例化产品类

5.简单工厂模式与工厂方法模式区别:

  • 简单工厂模式:本着高内聚低耦合的原则,将系统的逻辑部分和功能分开。

  • 工厂方法模式:和“简单工厂模式”不同的地方,是加入了“开放-封闭原则”(软件实体类、模块或者函数等等,应该可以扩展,但是不可以修改)规则,将简单工厂的内部判断逻辑,移动到了客户端代码来进行,在扩展新功能的时候,简单工厂模式要修改工厂类,工厂方法模式是只需要修改客户端。


三、抽象工厂模式

1.描述

抽象工厂模式(Abstract Factory Pattern),是围绕一个超级工厂创建其他工厂。

该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

2.特点

  • 意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

  • 主要解决:主要解决接口选择的问题。

  • 何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

  • 如何解决:在一个产品族里面,定义多个产品。

  • 关键代码:在一个工厂里聚合多个同类产品。

3.优缺点

优点:
当一个产品族中的多个对象,被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:
产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

4.类图说明

我们将创建 Shape 和 Color 接口,实现这些接口的实体类。

下一步是创建抽象工厂类 AbstractFactory。

接着定义工厂类 ShapeFactory 和 ColorFactory,这两个工厂类都是扩展了AbstractFactory。

然后创建一个工厂创造器/生成器类 FactoryProducer。

AbstractFactoryPatternDemo 类使用FactoryProducer 来获取 AbstractFactory 对象。

它将向 AbstractFactory 传递形状信息 Shape(CIRCLE / RECTANGLE / SQUARE),以便获取它所需对象的类型。

同时它还向 AbstractFactory 传递颜色信息 Color(RED / GREEN / BLUE),以便获取它所需对象的类型。


结尾

  • 感谢大家的耐心阅读,如有建议请私信或评论留言。
  • 如有收获,劳烦支持,关注、点赞、评论、收藏均可,博主会经常更新,与大家共同进步

以上是关于深入理解设计模式-简单工厂模式vs工厂方法模式vs抽象工厂模式对比讲解的主要内容,如果未能解决你的问题,请参考以下文章

深入理解设计模式-简单工厂模式(静态工厂方法模式)

深入理解设计模式-简单工厂模式(静态工厂方法模式)

设计模式之工厂模式详解和应用

深入理解设计模式:简单工厂模式

简单工厂模式

设计模式 模式PK:工厂模式VS建造者模式