侧边栏壁纸
博主头像
小白不想白 博主等级

行动起来,活在当下

  • 累计撰写 16 篇文章
  • 累计创建 5 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

设计模式之抽象工厂模式

小白不想白
2024-12-20 / 0 评论 / 0 点赞 / 2 阅读 / 0 字
温馨提示:
本文最后更新于2024-12-20,若内容或图片失效,请留言反馈。 部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

定义

定义
提供一系列相关或者相互依赖对象的接口,而无需指定他们的具体的类
具体的工厂负责实现具体的产品实例。

与工厂方法模式的区别

  • 抽象工厂中每个工厂可以创建多种类的产品;
  • 而工厂方法每个工厂只能创建一类

应用场景

  • 程序需要处理不同系列的相关产品,但是不希望他依赖于这些产品的具体类时,可以使用抽象工厂
  • 系统不依赖产品创建方式,有多个系列产品且只消费其中某一系列,要求提供统一接口的产品库。

优点

  • 可以确保从工厂中得到的产品都是兼容的。
  • 避免具体的产品和客户端代码之间的紧密耦合1
  • 符合单一职责原则
  • 符合开闭原则2

实现案例

模拟一个发送sql语句到不同数据库的案例

graph LR A[获取具体的数据库工厂类] --> B(调用方法创建连接) --> C(发送sql语句)

1、创建 连接数据库发送sql数据库工厂接口

// 连接数据库接口
public interface IConnection {  
    void connect(); // 连接  
}

// 发送sql接口
public interface ICommand {  
    void sendSql(); // 发送sql方法  
}

// 数据库工厂接口
public interface IDatabaseFactory {  
    IConnection createConnection(); // 创建连接  
    ICommand createCommand(); // 发送sql  
}

2、不同数据库实现相关接口

mysql实现

// 实现连接数据库接口
public class MysqlConnection implements IConnection{  
    @Override  
    public void connect() {  
        System.out.println("MysqlConnection connect");  
    }  
}

// 实现发送sql接口
public class MysqlCommand implements ICommand{  
    @Override  
    public void sendSql() {  
        System.out.println("mysql数据库发送sql语句");  
    }  
}

// 实现数据库工厂接口
public class MysqlDatabaseFactory implements IDatabaseFactory{  
  
    // 创建Mysql连接  
    @Override  
    public IConnection createConnection() {  
        return new MysqlConnection();  
    }  
  
    // 创建Mysql发送sql  
    @Override  
    public ICommand createCommand() {  
        return new MysqlCommand();  
    }  
}

PostgreSQL实现

// 实现连接数据库接口
public class PostgreSQLConnection implements IConnection{  
    @Override  
    public void connect() {  
        System.out.println("PostgreSQLConnection connect");  
    }  
}

// 实现发送sql接口
public class PostgreSQLCommand implements ICommand{  
    @Override  
    public void sendSql() {  
        System.out.println("PostgreSQL数据库发送sql语句");  
    }  
}

// 实现数据库工厂接口
public class PostgreSQLDatabaseFactory implements IDatabaseFactory{  
  
    // 创建PostgreSQL连接  
    @Override  
    public IConnection createConnection() {  
        return new PostgreSQLConnection();  
    }  
  
    // 创建PostgreSQL发送sql  
    @Override  
    public ICommand createCommand() {  
        return new PostgreSQLCommand();  
    }  
}

测试

客户端通过实例化具体的工厂类,并调用其创建不同目标数据库实现的方法创建不同具体数据库类的实例

public class Client {  
    public static void main(String[] args) {  
        // 测试mysql  
        IDatabaseFactory mysql = new MysqlDatabaseFactory();  
        mysql.createConnection().connect();  
        mysql.createCommand().sendSql();  
  
        // 测试pgsql  
        IDatabaseFactory pgsql = new PostgreSQLDatabaseFactory();  
        pgsql.createConnection().connect();  
        pgsql.createCommand().sendSql();  
    }  
}

运行结果:

MysqlConnection connect
mysql数据库发送sql语句
PostgreSQLConnection connect
PostgreSQL数据库发送sql语句

  1. 抽象工厂模式将具体产品的创建延迟到具体工厂的子类中,这样将对象的创建封装起来,可以减少客户端与具体产品类之间的依赖,从而使系统耦合度低,这样更有利于后期的维护和扩展

  2. 新增一种产品类时,只需要增加相应的具体产品类和相应的工厂子类即可

0

评论区