设计模式-工厂方法模式

定义理解

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

简单来说,简单工厂模式隐藏了创建对象的过程,将对象的使用和创建进行解耦,但是但我们需求变更,新增具体产品时,需要改动简单工厂类的逻辑,违反了"开放-封闭原则"(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.");  
    }  
}
相关推荐
会员果汁4 分钟前
23.设计模式-解释器模式
设计模式·解释器模式
「QT(C++)开发工程师」7 小时前
C++设计模式
开发语言·c++·设计模式
茶本无香8 小时前
设计模式之七—装饰模式(Decorator Pattern)
java·设计模式·装饰器模式
漂洋过海的鱼儿20 小时前
设计模式——EIT构型(三)
java·网络·设计模式
老蒋每日coding1 天前
AI Agent 设计模式系列(十八)—— 安全模式
人工智能·安全·设计模式
老蒋每日coding1 天前
AI Agent 设计模式系列(十六)—— 资源感知优化设计模式
人工智能·设计模式·langchain
老蒋每日coding1 天前
AI Agent 设计模式系列(十七)—— 推理设计模式
人工智能·设计模式
冷崖1 天前
桥模式-结构型
c++·设计模式
连山齐名1 天前
设计模式之一——堵塞队列
设计模式
会员果汁1 天前
19.设计模式-命令模式
设计模式·命令模式