java23种设计模式-工厂方法模式

news/2025/2/25 8:47:05

工厂方法模式(Factory Method Pattern)学习笔记

🌟 定义

工厂方法模式属于创建型设计模式,定义一个创建对象的接口,但让子类决定实例化哪一个类。将类的实例化操作延迟到子类,是面向对象设计中"开闭原则"的典型体现。


🎯 适用场景

  1. 需要解耦对象创建与使用
  2. 无法预知对象确切类型及其依赖关系
  3. 需要为不同环境提供不同产品实现
  4. 需要扩展系统时不影响已有代码
  5. 框架设计(允许用户扩展框架组件)

🔧 模式结构

📐 类图

«abstract»
Creator
+factoryMethod() : Product
+operation()
ConcreteCreatorA
+factoryMethod() : Product
ConcreteCreatorB
+factoryMethod() : Product
«interface»
Product
+doSomething()
ConcreteProductA
+doSomething()
ConcreteProductB
+doSomething()

🛠️ 核心组成

  1. Creator(抽象创建者)

    • 声明工厂方法(可包含默认实现)
    • 通过工厂方法获取产品对象
  2. ConcreteCreator(具体创建者)

    • 重写工厂方法,返回具体产品实例
  3. Product(抽象产品)

    • 定义产品接口
  4. ConcreteProduct(具体产品)

    • 实现抽象产品接口的具体类

📝 代码示例

文档处理系统案例

// 抽象产品:文档
interface Document {
    void open();
    void save();
    void close();
}

// 具体产品:Word文档
class WordDocument implements Document {
    @Override
    public void open() {
        System.out.println("打开Word文档");
    }
    
    @Override
    public void save() {
        System.out.println("保存Word文档");
    }
    
    @Override
    public void close() {
        System.out.println("关闭Word文档");
    }
}

// 具体产品:PDF文档
class PDFDocument implements Document {
    @Override
    public void open() {
        System.out.println("打开PDF文档");
    }
    
    @Override
    public void save() {
        System.out.println("保存PDF文档");
    }
    
    @Override
    public void close() {
        System.out.println("关闭PDF文档");
    }
}

// 抽象创建者:应用程序
abstract class Application {
    // 工厂方法
    public abstract Document createDocument();
    
    // 业务方法
    public void newDocument() {
        Document doc = createDocument();
        doc.open();
        doc.save();
        doc.close();
    }
}

// 具体创建者:Word应用
class WordApplication extends Application {
    @Override
    public Document createDocument() {
        return new WordDocument();
    }
}

// 具体创建者:PDF应用
class PDFApplication extends Application {
    @Override
    public Document createDocument() {
        return new PDFDocument();
    }
}

// 客户端使用
public class Client {
    public static void main(String[] args) {
        Application app = getApplication();
        app.newDocument();
    }
    
    private static Application getApplication() {
        // 根据配置或环境选择具体创建者
        return new WordApplication();
        // return new PDFApplication();
    }
}

✅ 优点

  1. 解耦客户端与具体产品类
  2. 符合开闭原则(新增产品不影响已有代码)
  3. 支持单一职责原则(创建逻辑集中管理)
  4. 支持可扩展性(容易添加新产品类型)
  5. 可作为框架基础(定义扩展点)

⚠️ 缺点

  1. 需要引入多个新类(增加复杂度)
  2. 需要继承体系(可能破坏封装性)
  3. 仅适用于相同产品类型的不同实现
  4. 需要预先设计工厂层次结构

🔄 相关模式对比

模式区别
简单工厂静态工厂方法 vs 多态工厂方法
抽象工厂创建产品族 vs 创建单个产品
模板方法共用算法骨架 vs 创建对象实例

💡 实践建议

  1. 命名规范

    • 工厂方法通常命名为createXxx()
    • 具体产品类使用产品类型+Product格式
  2. 组合使用技巧

    // 结合单例模式
    class DatabaseConnectionFactory {
        private static final ConnectionFactory instance = new MySQLConnectionFactory();
        
        public static Connection getConnection() {
            return instance.createConnection();
        }
    }
    
  3. 参数化工厂

    enum DocumentType { WORD, PDF, MARKDOWN }
    
    class UniversalApplication extends Application {
        private DocumentType type;
        
        public UniversalApplication(DocumentType type) {
            this.type = type;
        }
        
        @Override
        public Document createDocument() {
            switch(type) {
                case WORD: return new WordDocument();
                case PDF: return new PDFDocument();
                default: throw new IllegalArgumentException();
            }
        }
    }
    
  4. 依赖注入

    // 通过构造函数注入工厂
    class DocumentService {
        private final DocumentFactory factory;
        
        public DocumentService(DocumentFactory factory) {
            this.factory = factory;
        }
        
        public void processDocument() {
            Document doc = factory.createDocument();
            // 处理文档...
        }
    }
    

🚀 典型应用

  1. Java集合框架

    // Iterator工厂方法
    List<String> list = new ArrayList<>();
    Iterator<String> it = list.iterator();  // 工厂方法
    
  2. Spring框架

    // BeanFactory接口
    public interface BeanFactory {
        Object getBean(String name);
    }
    
  3. 日志框架

    // Logger工厂
    Logger logger = LoggerFactory.getLogger(MyClass.class);
    
  4. JDBC驱动

    // DriverManager.getConnection()本质是工厂方法
    Connection conn = DriverManager.getConnection(url);
    

📌 实现注意事项

  1. 工厂方法可见性

    • 通常声明为protected(允许子类重写)
    • 也可以声明为public(直接调用)
  2. 空对象处理

    class NullDocument implements Document {
        @Override
        public void open() { /* 无操作 */ }
        // 其他方法类似
    }
    
  3. 默认实现策略

    abstract class Application {
        // 提供默认产品实现
        public Document createDocument() {
            return new DefaultDocument();
        }
    }
    
  4. 产品注册机制

    class PluginManager {
        private static Map<String, PluginFactory> plugins = new HashMap<>();
        
        public static void registerPlugin(String type, PluginFactory factory) {
            plugins.put(type, factory);
        }
        
        public static Plugin createPlugin(String type) {
            return plugins.get(type).create();
        }
    }
    

掌握工厂方法模式的关键在于理解对象创建责任委托的思想,合理使用可以显著提高系统的灵活性和可维护性。当系统需要支持多种同类产品的扩展时,工厂方法模式是最佳选择方案之一。


http://www.niftyadmin.cn/n/5865274.html

相关文章

OPPO发布新型折叠屏手机 起售价8999

在竞争激烈的智能手机市场&#xff0c;折叠屏手机作为高端科技的代表&#xff0c;一直备受关注。2025年2月20日晚&#xff0c;OPPO推出最新一代折叠屏旗舰手机Find N5&#xff0c;以其极致轻薄的设计、全面升级的性能和创新的功能&#xff0c;再次成为行业焦点。这款起售价8999…

在大数据项目中如何设计和优化数据模型

在大数据项目中&#xff0c;设计和优化数据模型是一个涉及多个步骤和维度的复杂过程。以下是我通常采取的方法&#xff1a; 一、数据模型设计 明确业务需求&#xff1a; 深入了解项目的业务场景和目标&#xff0c;明确数据模型需要解决的具体问题。与业务团队紧密合作&#xf…

Python GUI

Python GUI pip install PyQt5 pip install PySide2 pip install wxPython 这个下载太久了 import tkinter as tk def main(): # 创建主窗口 root tk.Tk() root.title("Hello World") # 创建一个标签&#xff0c;显示文本 label tk.Lab…

《计算机视觉OpenCV》——对视频中的文档进行实时检测和处理实例

对视频中的文档进行实时检测和处理 项目介绍&#xff1a;主要实现了从摄像头实时捕获视频流&#xff0c;检测其中的文档&#xff08;四边形物体&#xff09;&#xff0c;并对检测到的文档进行透视变换和二值化处理的功能。 综合运用了摄像头操作、图像处理、轮廓检测、透视变换…

VUE2.0+elementUI+腾讯云点播上传视频

“vue”: “^2.6.11”, TcVod&#xff1a; “vod-js-sdk-v6”: “^1.7.0”, “element-ui”: “^2.15.6”, 直接上代码 上传视频加上传封面 在这里插入代码片 <template><div><p>上传封面</p><el-uploadclass"avatar-uploader"actio…

Java设计模式 —— 【行为型模式】状态模式(State Pattern) 详解

文章目录 一、模式介绍二、结构三、优缺点四、使用场景五、案例演示 一、模式介绍 应用程序中的有些对象可能会根据不同的情况做出不同的行为&#xff0c;我们把这种对象称为有状态的对象&#xff0c;而把影响对象行为的一个或多个动态变化的属性称为状态。当有状态的对象与外…

【java基础】Java 中的继承

一、前言 Java 作为一门经典的面向对象编程语言&#xff0c;继承是其核心特性之一。继承就如同家族血脉传承&#xff0c;子类能够承接父类的属性与方法&#xff0c;在复用代码的同时还能按需拓展 二、继承的基本概念 2.1 生活中的继承类比 在日常生活里&#xff0c;继承的概…

细说向量化知识库

向量化知识库与 RAG&#xff1a;打造智能 AI 知识检索系统 引言 在大模型&#xff08;LLM&#xff09;迅猛发展的今天&#xff0c;如何让 AI 获取最新、最准确的信息&#xff0c;成为一个核心问题。大多数 LLM 依赖其训练数据来回答问题&#xff0c;但它们的知识是静态的&#…