Abstract Factory
1. 模式定义
提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们具体的类型
实际上是由一系列相关的工厂方法抽象而来的。
类图
应用场景 程序需要处理不同系列的相关产品,但是你不希望它依赖于这些产品的具体类时,可以使用抽象工厂
优点
- 可以确信你从工厂得到的产品彼此是兼容的
- 可以避免具体产品和客户端代码之间的紧密耦合
- 符合单一职责原则
- 符合开闭原则
JDK源码应用
java.sql.Connection
java.sql.Driver
2. 代码实现
假定前提:假如现在要开发一套数据库连接的类,其中改变的部分是不同的数据库可能具体实现上有一定的差异;不变的部分是无论什么数据库,都会需要例如
connection
、command
这样的方法。
抽象定义:
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();
}