23种设计模式之【工厂方法模式】-核心原理与 Java实践

文章目录

工厂方法模式(Factory Method Pattern)

工厂方法模式是 23 种设计模式中的一种创建型模式,其核心思想是定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类的实例化推迟到子类中进行,从而实现创建逻辑与使用逻辑的解耦。

核心原理

抽象产品(Product):

定义产品的接口,是工厂方法模式所创建对象的超类型

描述所有产品共有的公共接口
具体产品(ConcreteProduct):

实现抽象产品接口,是工厂方法模式的创建目标

每个具体产品对应一个具体工厂
抽象工厂(Factory):

声明工厂方法,该方法返回一个抽象产品类型

可以包含其他与产品相关的业务逻辑
具体工厂(ConcreteFactory):

实现抽象工厂的工厂方法,返回具体产品的实例

负责创建对应类型的具体产品

工厂方法模式的核心是 "将对象创建延迟到子类",通过多态性实现了产品创建的灵活扩展。

Java 实践示例

以 "文档编辑器" 为例实现工厂方法模式:

编辑器可以创建不同类型的文档(文本文档、表格文档)

每种文档由对应的工厂负责创建

java 复制代码
package com.example.demo;

public class FactoryMethodPattern {
    public static void main(String[] args) {
        // 创建文本文档工厂并使用
        DocumentFactory textFactory = new TextDocumentFactory();
        Editor textEditor = new Editor(textFactory);
        textEditor.newDocument();
        textEditor.openDocument();

        System.out.println("---");

        // 创建表格文档工厂并使用
        DocumentFactory tableFactory = new TableDocumentFactory();
        Editor tableEditor = new Editor(tableFactory);
        tableEditor.newDocument();
        tableEditor.openDocument();
    }

    // 抽象产品:文档接口
    public interface Document {
        void create();
        void open();
    }
    // 具体产品:文本文档
    public static class TextDocument implements Document {
        @Override
        public void create() {
            System.out.println("创建文本文档");
        }

        @Override
        public void open() {
            System.out.println("打开文本文档,显示文本内容");
        }
    }

    // 具体产品:表格文档
    public static class TableDocument implements Document {
        @Override
        public void create() {
            System.out.println("创建表格文档");
        }

        @Override
        public void open() {
            System.out.println("打开表格文档,显示表格内容");
        }
    }

    // 抽象工厂:文档工厂接口
    public interface DocumentFactory {
        Document createDocument();
    }

    // 具体工厂:文本文档工厂
    public static class TextDocumentFactory implements DocumentFactory {
        @Override
        public Document createDocument() {
            return new TextDocument();
        }
    }

    // 具体工厂:表格文档工厂
    public static class TableDocumentFactory implements DocumentFactory {
        @Override
        public Document createDocument() {
            return new TableDocument();
        }
    }

    // 编辑器类(使用产品的客户端)
    public static class Editor {
        private DocumentFactory factory;

        // 注入工厂
        public Editor(DocumentFactory factory) {
            this.factory = factory;
        }

        // 新建文档
        public void newDocument() {
            Document doc = factory.createDocument();
            doc.create();
        }

        // 打开文档
        public void openDocument() {
            Document doc = factory.createDocument();
            doc.open();
        }
    }
}

运行结果

bash 复制代码
创建文本文档
打开文本文档,显示文本内容
---
创建表格文档
打开表格文档,显示表格内容

工厂方法模式的特点

优点:

符合开闭原则:新增产品时只需添加对应的具体产品和具体工厂,无需修改原有代码

解耦创建与使用:客户端只需关心抽象产品和抽象工厂,无需知道具体实现

多态性:通过不同工厂创建不同产品,客户端可透明地使用不同产品

缺点:

类数量增加:每增加一个产品,通常需要新增一个具体产品类和一个具体工厂类

复杂度提高:相比简单工厂模式,引入了更多的抽象和接口

与简单工厂模式的区别:

简单工厂:由一个工厂类负责所有产品的创建,新增产品需修改工厂类(违反开闭原则)

工厂方法:每个产品由对应的工厂创建,新增产品只需新增工厂(符合开闭原则)

工厂方法模式的应用场景

类库设计:

框架需要提供扩展点时,如 Java 集合框架中的Collection接口的iterator()方法(工厂方法),由具体集合类(如ArrayList、HashSet)实现

日志框架:

不同日志实现(如 Log4j、SLF4J)可通过工厂方法模式切换,客户端面向抽象日志接口编程

数据库访问:

不同数据库(MySQL、Oracle)的连接创建,可通过ConnectionFactory的不同实现类完成

插件系统:

支持插件扩展的系统,每个插件对应一个工厂,通过工厂方法创建插件实例

GUI 工具包:

跨平台 GUI 工具包中,按钮、文本框等组件的创建由对应平台的工厂实现(如 WindowsFactory、MacFactory)

工厂方法模式是创建型模式中应用最广泛的模式之一,它通过将对象创建延迟到子类,实现了创建逻辑的灵活扩展,是框架设计中常用的模式。

相关推荐
毕设源码-朱学姐13 小时前
【开题答辩全过程】以 工厂能耗分析平台的设计与实现为例,包含答辩的问题和答案
java·vue.js
Spring AI学习15 小时前
Spring AI深度解析(9/50):可观测性与监控体系实战
java·人工智能·spring
java1234_小锋16 小时前
Spring IoC的实现机制是什么?
java·后端·spring
xqqxqxxq16 小时前
背单词软件技术笔记(V2.0扩展版)
java·笔记·python
消失的旧时光-194316 小时前
深入理解 Java 线程池(二):ThreadPoolExecutor 执行流程 + 运行状态 + ctl 原理全解析
java·开发语言
哈哈老师啊17 小时前
Springboot学生综合测评系统hxtne(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·数据库·spring boot
4311媒体网17 小时前
帝国cms调用文章内容 二开基本操作
java·开发语言·php
zwxu_17 小时前
Nginx NIO对比Java NIO
java·nginx·nio
可观测性用观测云18 小时前
Pyroscope Java 接入最佳实践
java
气π19 小时前
【JavaWeb】——(若依 + AI)-基础学习笔记
java·spring boot·笔记·学习·java-ee·mybatis·ruoyi