设计模式-抽象工厂模式

200 阅读1分钟

Abstract Factory

1. 模式定义

提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们具体的类型

实际上是由一系列相关的工厂方法抽象而来的。

类图

image.png

应用场景 程序需要处理不同系列的相关产品,但是你不希望它依赖于这些产品的具体类时,可以使用抽象工厂

优点

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

JDK源码应用

java.sql.Connection
java.sql.Driver

2. 代码实现

假定前提:假如现在要开发一套数据库连接的类,其中改变的部分是不同的数据库可能具体实现上有一定的差异;不变的部分是无论什么数据库,都会需要例如connectioncommand这样的方法。

抽象定义:

interface IConnection {
    void connecte();
}
interface ICommand {
    void command();
}
interface IDatabaseUtils {
    IConnection getConnection();
    ICommand getCommand();
}

MySQL实现

class MysqlConnection implements IConnection {

    @Override
    public void connecte() {
        System.out.println("MySQL connected");
    }
}
class MysqlCommand implements ICommand {

    @Override
    public void command() {
        System.out.println("MySQL commanded");
    }
}
class MySQLDatabaseUtils implements IDatabaseUtils {

    @Override
    public IConnection getConnection() {
        return new MysqlConnection();
    }

    @Override
    public ICommand getCommand() {
        return new MysqlCommand();
    }
}

Oracle实现

class OracleConnection implements IConnection {

    @Override
    public void connecte() {
        System.out.println("Oracle connected");
    }
}
class OracleCommand implements ICommand {

    @Override
    public void command() {
        System.out.println("Oracle commanded");
    }
}
class OracleDatabaseUtils implements IDatabaseUtils {

    @Override
    public IConnection getConnection() {
        return new OracleConnection();
    }

    @Override
    public ICommand getCommand() {
        return new OracleCommand();
    }
}

具体使用:

public static void main(String[] args) {
    IDatabaseUtils iDatabaseUtils = new OracleDatabaseUtils();
    IConnection connection = iDatabaseUtils.getConnection();
    connection.connecte();
    ICommand command = iDatabaseUtils.getCommand();
    command.command();
}