Code Ease Code Ease
  • 个人博客网站 (opens new window)
  • 好用的工具网站 (opens new window)
  • Java核心基础
  • 框架的艺术
  • 分布式与微服务
  • 开发经验大全
  • 设计模式
  • 版本新特性
数据库系列
大数据+AI
  • xxl-job
运维与Linux
  • 基于SpringBoot和BootStrap的论坛网址
  • 基于VuePress的个人博客网站
  • 基于SpringBoot开发的小功能
  • 做一个自己的IDEA插件
程序人生
关于我
  • 分类
  • 标签
  • 归档

神秘的鱼仔

你会累是因为你在走上坡路
  • 个人博客网站 (opens new window)
  • 好用的工具网站 (opens new window)
  • Java核心基础
  • 框架的艺术
  • 分布式与微服务
  • 开发经验大全
  • 设计模式
  • 版本新特性
数据库系列
大数据+AI
  • xxl-job
运维与Linux
  • 基于SpringBoot和BootStrap的论坛网址
  • 基于VuePress的个人博客网站
  • 基于SpringBoot开发的小功能
  • 做一个自己的IDEA插件
程序人生
关于我
  • 分类
  • 标签
  • 归档
服务器
  • 适配器模式详解与应用
  • 迭代器模式:理解与实践
  • 模板方法设计模式理论与应用
  • 快速理解工厂方法模式,及其在源码中的应用
    • (一)、什么是工厂方法模式
    • (二)、工厂方法模式中的角色
    • (三)、工厂方法模式代码案例
    • (四)、为什么要用工厂方法模式
      • 1、良好的扩展性
      • 2、良好的封装性
      • 3、框架和实现的隔离性
    • (五)、工厂方法模式在源码中的应用
    • (六)总结
  • 详解单例模式及其在Sping中的最优实践
  • 快速理解原型模式,及其在源码中的应用
  • 快速理解建造者模式,及其在JDK源码中的应用
  • 最实用的设计模式:策略模式的快速理解
  • 快速理解装饰者模式,及其在JDK源码中的应用
  • 快速理解观察者模式,原来它还有这么多其他名字
  • 设计模式
CodeEase
2023-10-23
目录

快速理解工厂方法模式,及其在源码中的应用

作者:鱼仔
博客首页: codeease.top (opens new window)
公众号:Java鱼仔

# (一)、什么是工厂方法模式

有一个总工厂负责生产各种电视产品,此时来了一个生产小米电视的需求,就会分配出一个制作小米电视的工厂,然后就能用该工厂生产小米电视了。 上面这种通过工厂来实例化类的方式抽象到设计模式中就是工厂方法模式。

# (二)、工厂方法模式中的角色

工厂方法模式中有四种角色,理解这四种角色就能理解工厂方法模式。

抽象工厂(Factory):也就是开题这个例子中的总工厂,抽象工厂是所有具体工厂的基类,在抽象工厂角色中,声明了生成产品实例的方法。抽象工厂的目的是为了让实例的生成不再通过new,而是通过生成实例的专用方法

具体工厂(ConcreteFactory):也就是开题这个例子中的制作小米电视的工厂,是抽象工厂的子类,实现抽象工厂中定义的生成产品实例的方法。

抽象产品(Product):也就是开题这个例子中的电视产品,是一个总的抽象产品,定义了一个产品的一系列方法。

具体产品(ConcreteProduct):也就是开题这个例子中的小米电视,是一个具体的产品,实现抽象产品的方法。

# (三)、工厂方法模式代码案例

下面的代码描述的是工厂方法模式的案例,实现本文第一章的场景 抽象电视工厂类,提供一个produceTv的抽象方法。

public abstract class TvFactory {
    public abstract Television produceTv();
}
1
2
3

抽象电视产品类,提供一个show方法。

public abstract class Television {
    public abstract void show();
}
1
2
3

具体的电视产品小米电视:

public class XiaomiTelevision extends Television{
    @Override
    public void show() {
        System.out.println("用小米电视看视频");
    }
}
1
2
3
4
5
6

具体工厂:用于生产小米电视:

public class XiaomiTvFactory extends TvFactory{
    @Override
    public Television produceTv() {
        System.out.println("制造了小米电视");
        return new XiaomiTelevision();
    }
}
1
2
3
4
5
6
7

最后写个测试方法:

public class Main {
    public static void main(String[] args) {
        Television XiaomiTelevision = new XiaomiTvFactory().produceTv();
        XiaomiTelevision.show();
    }
}

1
2
3
4
5
6
7

这个时候又来了一个华为电视的需求,只需要和生产小米电视一样,生成华为电视具体工厂和华为电视具体类就可以了,如下:

public class HuaweiTvFactory extends TvFactory{
    @Override
    public Television produceTv() {
        System.out.println("制造了一台华为电视");
        return new HuaweiTelevision();
    }
}
1
2
3
4
5
6
7
public class HuaweiTelevision extends Television{
    @Override
    public void show() {
        System.out.println("使用华为电视看视频");
    }
}
1
2
3
4
5
6

然后就可以使用了

public class Main {
    public static void main(String[] args) {
        Television XiaomiTelevision = new XiaomiTvFactory().produceTv();
        XiaomiTelevision.show();
        Television HuaweiTelevision = new HuaweiTvFactory().produceTv();
        HuaweiTelevision.show();
    }
}
1
2
3
4
5
6
7
8

# (四)、为什么要用工厂方法模式

从上面的例子也能看出来,使用工厂方法模式后代码变得更加复杂了,并且想在项目中应用上貌似很困难。但是工厂方法模式却能带来一些不一样的东西

# 1、良好的扩展性

在设计一个项目的时候,首先要设计的是整体的代码架构。设计了顶层的抽象工厂和抽象产品之后,后续有其他的底层实现时,也只需要新增一个继承了抽象工厂的具体工厂类就行。

# 2、良好的封装性

以前创建一个类需要通过new方法创建,有了工厂类之后,创建的这个动作就交给工厂类去实现类。假设创建一个类的过程很复杂,有许多额外的逻辑,那么这些逻辑只需要在工厂类中实现一次,具体的产品都可以通过工厂类直接获取到。减少模块间的耦合。

# 3、框架和实现的隔离性

我们可以把抽象工厂和抽象产品定义为框架,而具体工厂和具体产品是实现。通过工厂方法模式,框架和实现之间是分离的。实现了底层的修改不会导致上层的改动。

# (五)、工厂方法模式在源码中的应用

我们来看一下slf4j中是如何应用工厂方法模式的:

首先slf4j定义一个抽象工厂ILoggerFactory

public interface ILoggerFactory {
    Logger getLogger(String var1);
}
1
2
3

接着定义了一个抽象产品Logger:

public interface Logger {
    ... ...
}
1
2
3

具体工厂有很多,都实现了抽象工厂,这里展示其中一个SubstituteLoggerFactory

具体工厂用于生产具体的产品,SubstituteLogger就是一种具体的产品,从上边的代码中就可以看到,SubstituteLoggerFactory工厂在生产SubstituteLogger具体产品时,做了一定的处理。而真正使用时,只需要通过getLogger方法就可以得到具体产品,这就是工厂方法模式的魅力。

# (六)总结

工厂方法模式相比于适配器模式、迭代器模式或者模板方法模式更加难理解,也更加难应用到项目中。但是我们依旧可以从中学到设计的魅力,学到接口、抽象类存在的目的。

上次更新: 2025/02/18, 11:30:08
模板方法设计模式理论与应用
详解单例模式及其在Sping中的最优实践

← 模板方法设计模式理论与应用 详解单例模式及其在Sping中的最优实践→

最近更新
01
AI大模型部署指南
02-18
02
半个月了,DeepSeek为什么还是服务不可用
02-13
03
Python3.9及3.10安装文档
01-23
更多文章>
Theme by Vdoing | Copyright © 2023-2025 备案图标 浙公网安备33021202002405 | 浙ICP备2023040452号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式