定义
提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。
(定义和图不理解的,可以先看下面的示例,回头再去理解)
示例
以数据库为例
(1)变化的部分: Mysq、Oracle…等数据库
(2)不变的部分:建立连接 执行命令
定义不变部门的接口:建立连接IConnection 执行命令ICommand
interface IConnection{
void connect();
}
interface ICommand{
void command();
}
再定义一个组装接口,将上面两个接口放在一起,后面统一通过这个组装接口,进行连接、执行命令等一系列操作
interface IDBComponent{
IConnection getConnect();
ICommand getCommand();
}
变化的部分的实现:
Mysql:
class MysqlConnect implements IConnection{
@Override
public void connect() {
System.out.println("mysql connect.");
}
}
class MysqlCommand implements ICommand{
@Override
public void command() {
System.out.println("mysql command.");
}
}
class MysqlDBComponent implements IDBComponent{
@Override
public IConnection getConnect() {
return new MysqlConnect();
}
@Override
public ICommand getCommand() {
return new MysqlCommand();
}
}
Oracle:
class OracleConnect implements IConnection{
@Override
public void connect() {
System.out.println("oracle connect.");
}
}
class OracleCommand implements ICommand{
@Override
public void command() {
System.out.println("mysql command.");
}
}
class OracleDBComponent implements IDBComponent{
@Override
public IConnection getConnect() {
return new OracleConnect();
}
@Override
public ICommand getCommand() {
return new OracleCommand();
}
}
调用
public static void main(String[] args) {
IDBComponent idbComponent = new OracleDBComponent(); // oracle
//IDBComponent idbComponent = new MysqlDBComponent(); // mysql
IConnection connection = idbComponent.getConnect();
connection.connect();
ICommand command = idbComponent.getCommand();
command.command();
}
应用场景
程序需要处理不同系列的相关产品,但是您不希望它依赖于这些产品的 具体类时, 可以使用抽象工厂
优点
1.可以确信你从工厂得到的产品彼此是兼容的。
2.可以避免具体产品和客户端代码之间的紧密耦合。
3.符合单一职责原则
4.符合开闭原则