抽象工厂模式
定义:
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
抽象工厂模式主要用于创建相关对象的家族。当一个产品族中需要被设计在一起工作时,通过抽象工厂模式,能够保证客户端始终只使用同一个产品族中的对象;并且通过隔离具体类的生成,使得客户端不需要明确指定具体生成类;所有的具体工厂都实现了抽象工厂中定义的公共接口,因此只需要改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。
应用场景:
程序需要处理不同系列的产品,但是你不希望它依赖于这些产品的具体类是,可以使用抽象工厂。
优点:
- 可以确信从工厂得到的产品是彼此兼容的
- 可以避免具体产品和客户端代码之间的紧密耦合
- 符合单一职责原则
- 符合开闭原则
代码示例:
我们以数据库举例,数据库的,connection、command是不变的。数据库产品是变化的,如MySQL、Oracle等数据库。
数据库相关代码:
interface DataBase {
Connection getConnection();
Command getCommand();
}
interface Connection {
void connection();
}
interface Command {
void command();
}
MySQL相关代码:
class MySQLDataBase implements DataBase{
public Connection getConnection() {
return new MySQLConnection();
}
public Command getCommand() {
return new MySQLCommand();
}
}
class MySQLConnection implements Connection {
public void connection() {
System.out.println("MySQL数据库建立连接...");
}
}
class MySQLCommand implements Command {
public void command() {
System.out.println("MySQL数据库发送指令...");
}
}
Oracle代码:
class OracleDataBase implements DataBase {
public Connection getConnection() {
return new OracleConnection();
}
public Command getCommand() {
return new OracleCommand();
}
}
class OracleConnection implements Connection{
public void connection() {
System.out.println("Oracle数据库建立连接...");
}
}
class OracleCommand implements Command {
public void command() {
System.out.println("Oracle数据库发送指令...");
}
}
客户端相关代码:
public class AbstractFactory {
public static void main(String[] args) {
DataBase mysqlDataBase = new MySQLDataBase();
mysqlDataBase.getConnection().connection();
mysqlDataBase.getCommand().command();
DataBase oracleDataBase = new OracleDataBase();
oracleDataBase.getConnection().connection();
oracleDataBase.getCommand().command();
}
}