设计模式-工厂方法模式

定义理解

工厂方法模式定义了一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

简单来说,简单工厂模式隐藏了创建对象的过程,将对象的使用和创建进行解耦,但是但我们需求变更,新增具体产品时,需要改动简单工厂类的逻辑,违反了"开放-封闭原则"(OCP),即软件实体应该对扩展开放,对修改关闭。因此出现了工厂方法模式。

构成

  • 抽象工厂(Abstract Factory):提供了一个创建产品的接口,调用者通过它访问具体工厂的工厂方法。
  • 具体工厂(Concrete Factory):实现了抽象工厂中的抽象方法,完成具体产品的创建。
  • 抽象产品(Abstract Product):定义了产品的规范,描述产品的主要特性和功能。
  • 具体产品 (Concrete Product):实现了抽象产品所定义的接口,由具体工厂来创建具体产品对象。

工作原理

  1. .工厂方法模式通过定义工厂接口,将对象的创建推迟到子类。
  2. 客户端只需要知道所要创建的产品的抽象接口,而不需要知道具体的实现细节。
  3. 子类可以根据需要实现不同的工厂方法,创建不同的产品对象。

优点

  • 符合开闭原则:新增一种产品时,只需要增加相应的具体产品类和相应的工厂子类即可,无需修改原有代码。
  • 解耦:将对象的创建与使用分离,降低了客户端与具体产品类的耦合度。
  • 可扩展性:可以在不修改原有代码的情况下,通过增加新的具体工厂和具体产品类来扩展系统。

缺点

  • 系统复杂度增加:每增加一个产品,除了需要增加新产品类外,还需要提供与之对应的具体工厂类,系统类的个数将成对增加。
  • 理解难度增加:由于引入了抽象层,客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度。

应用场景

  • 当一个类不知道它所需要的对象的类时,可以使用工厂方法模式。
  • 当需要将创建对象的任务委托给多个工厂子类中的某一个时,可以使用工厂方法模式。
  • 当需要隐藏对象的创建过程,或者需要隐藏对象的创建细节时,可以使用工厂方法模式。

实例

工厂方法模式

java 复制代码
// 抽象产品:日志接口  
interface Logger {  
    void log(String message);  
}  
  
// 具体产品:Log4j 日志实现  
class Log4jLogger implements Logger {  
    @Override  
    public void log(String message) {  
        System.out.println("Log4j: " + message);  
    }  
}  
  
// 具体产品:Logback 日志实现  
class LogbackLogger implements Logger {  
    @Override  
    public void log(String message) {  
        System.out.println("Logback: " + message);  
    }  
}  
  
// 抽象工厂:日志工厂接口  
interface LoggerFactory {  
    Logger getLogger();  
}  
  
// 具体工厂:Log4j 日志工厂实现  
class Log4jLoggerFactory implements LoggerFactory {  
    @Override  
    public Logger getLogger() {  
        return new Log4jLogger();  
    }  
}  
  
// 具体工厂:Logback 日志工厂实现  
class LogbackLoggerFactory implements LoggerFactory {  
    @Override  
    public Logger getLogger() {  
        return new LogbackLogger();  
    }  
}  
  
// 客户端代码  
public class Client {  
    public static void main(String[] args) {  
        // 使用 Log4j 日志工厂创建日志实例  
        LoggerFactory log4jFactory = new Log4jLoggerFactory();  
        Logger log4jLogger = log4jFactory.getLogger();  
        log4jLogger.log("This is a Log4j log message.");  
  
        // 使用 Logback 日志工厂创建日志实例  
        LoggerFactory logbackFactory = new LogbackLoggerFactory();  
        Logger logbackLogger = logbackFactory.getLogger();  
        logbackLogger.log("This is a Logback log message.");  
    }  
}
相关推荐
用户938515635073 小时前
工厂模式与 Nest.js 核心思想 —— 从蜜雪冰城到企业级架构
后端·设计模式·nestjs
烬羽7 小时前
从 nest new 到 Hello World:一个最小 NestJS 项目,讲透工厂 + 装饰器 + 模块化
设计模式·node.js·nestjs
艺艺生辉1 天前
从if-else到策略模式
后端·设计模式
小林ixn1 天前
单例模式:从弹窗管理到全局状态,一个模式搞定
前端·javascript·设计模式
AI人工智能+电脑小能手1 天前
大白话说Java设计模式-17-装饰器模式(源码剖析篇)
java·spring·设计模式·装饰器模式·源码分析·io流
workflower2 天前
案例 :某交通厅基于AI技术的智能安全运营实践
网络·人工智能·安全·设计模式·机器人
AI人工智能+电脑小能手2 天前
大白话说Java设计模式-16-装饰器模式(业务实战篇)
java·设计模式·装饰器模式·功能扩展·动态增强
workflower3 天前
例二:某汽车制造企业深度融合AI智能体,构建园区网络的智能运维体系
人工智能·机器学习·设计模式·机器人·云计算·汽车·制造
ly76893 天前
Java 设计模式详解:从原则到 23 种经典模式
java·开发语言·设计模式
AI人工智能+电脑小能手3 天前
大白话说Java设计模式-14-适配器模式(业务实战篇)
java·设计模式·适配器模式·系统兼容·多渠道对接