「软件设计模式」工厂方法模式 vs 抽象工厂模式

发布于:2025-02-14 ⋅ 阅读:(122) ⋅ 点赞:(0)

前言

在软件工程领域,设计模式是解决常见问题的经典方案。本文将深入探讨两种创建型模式:工厂方法模式抽象工厂模式,通过理论解析与实战代码示例,帮助开发者掌握这两种模式的精髓。


一、工厂方法模式(Factory Method Pattern)

1.1 模式思想

工厂方法模式的核心在于将对象的创建延迟到子类,通过定义创建对象的接口,让子类决定实例化哪个类。这种模式完美体现了依赖倒置原则

1.2 模式结构

  • Product:抽象产品接口
  • ConcreteProduct:具体产品实现
  • Creator:抽象创建者
  • ConcreteCreator:具体创建者

1.3 代码示例

// 抽象产品
interface Logger {
    void log(String message);
}

// 具体产品
class FileLogger implements Logger {
    @Override
    public void log(String message) {
        System.out.println("文件日志: " + message);
    }
}

class DatabaseLogger implements Logger {
    @Override
    public void log(String message) {
        System.out.println("数据库日志: " + message);
    }
}

// 抽象工厂
interface LoggerFactory {
    Logger createLogger();
}

// 具体工厂
class FileLoggerFactory implements LoggerFactory {
    @Override
    public Logger createLogger() {
        return new FileLogger();
    }
}

class DatabaseLoggerFactory implements LoggerFactory {
    @Override
    public Logger createLogger() {
        return new DatabaseLogger();
    }
}

// 使用示例
public class Client {
    public static void main(String[] args) {
        LoggerFactory factory = new DatabaseLoggerFactory();
        Logger logger = factory.createLogger();
        logger.log("用户登录成功");
    }
}

1.4 适用场景

  • 需要灵活扩展产品类型
  • 创建过程需要封装处理逻辑
  • 需要解耦客户端与具体产品类

二、抽象工厂模式(Abstract Factory Pattern)

2.1 模式思想

抽象工厂模式通过创建相关对象族来提升系统的扩展性,强调产品系列的概念。它比工厂方法模式更高层次的抽象。

2.2 模式结构

  • AbstractFactory:抽象工厂接口
  • ConcreteFactory:具体工厂实现
  • AbstractProduct:抽象产品接口
  • ConcreteProduct:具体产品实现

2.3 代码示例

// 数据库连接抽象产品

interface Connection {

    void connect();

}


// 数据库命令抽象产品

interface Command {

    void execute();

}


// MySQL具体产品

class MySQLConnection implements Connection {

    @Override

    public void connect() {

        System.out.println("MySQL连接建立");

    }

}


class MySQLCommand implements Command {

    @Override

    public void execute() {

        System.out.println("执行MySQL命令");

    }

}


// Oracle具体产品

class OracleConnection implements Connection {

    @Override

    public void connect() {

        System.out.println("Oracle连接建立");

    }

}


class OracleCommand implements Command {

    @Override

    public void execute() {

        System.out.println("执行Oracle命令");

    }

}


// 抽象工厂

interface DatabaseFactory {

    Connection createConnection();

    Command createCommand();

}


// 具体工厂

class MySQLFactory implements DatabaseFactory {

    @Override

    public Connection createConnection() {

        return new MySQLConnection();

    }


    @Override

    public Command createCommand() {

        return new MySQLCommand();

    }

}


class OracleFactory implements DatabaseFactory {

    @Override

    public Connection createConnection() {

        return new OracleConnection();

    }


    @Override

    public Command createCommand() {

        return new OracleCommand();

    }

}


// 使用示例

public class Client {

    public static void main(String[] args) {

        DatabaseFactory factory = new OracleFactory();

        Connection conn = factory.createConnection();

        Command cmd = factory.createCommand();

        

        conn.connect();

        cmd.execute();

    }

}
​

2.4 适用场景

  • 需要创建多个相关对象组成的系列
  • 系统需要支持不同产品族的切换
  • 产品对象之间存在约束关系

三、核心差异对比

维度 工厂方法模式 抽象工厂模式
抽象层次 单个产品创建 产品族创建
扩展方向 垂直扩展(新增产品类型) 水平扩展(新增产品族)
实现方式 继承 组合
系统复杂度 简单 复杂
典型应用场景 日志记录器、支付方式 跨平台UI组件、数据库访问

四、模式选择指南

  • 选择工厂方法模式当:

    • 需要解耦客户端与具体产品类
    • 系统需要支持多种同类产品的创建
    • 产品类型相对单一
  • 选择抽象工厂模式当:

    • 需要创建多个相互关联的产品
    • 需要保证产品之间的兼容性
    • 系统需要支持不同产品族的切换

五、最佳实践建议

  1. 优先使用工厂方法:当产品结构简单时,避免过度设计
  2. 注意开闭原则:通过扩展而非修改来增加新产品
  3. 使用依赖注入:结合Spring等框架实现更灵活的工厂管理
  4. 文档化产品族:明确各产品之间的约束关系
  5. 性能考量:复杂工厂实现需要考虑对象池等优化手段

结语

        掌握工厂模式是成为架构师的重要阶梯。工厂方法模式像专业工匠,专注单一产品的精雕细琢;抽象工厂模式如生产总监,统筹协调整个产品家族。理解它们的差异,才能在系统设计中做出最合适的选择。 


网站公告

今日签到

点亮在社区的每一天
去签到