抽象工厂模式:提供一个创建一系列相关对象的接口,而无需指定具体的类。工厂方法模式解决了简单工厂模式工厂类责任过重的问题,但是由于工厂方法模式只创建一类具体类的对象,会导致系统中工厂类过多,会增加系统开销。所以我们要考虑将一些相关的具体类组成一个“具体类族”,由一个工厂统一生产
优点:
便于交换产品系列,可以轻松改变产品配置
实现:
假设系统中用的是MySql数据库,众所周知,MySql的语法和Oracle语法有很多差别,如果语句是写死在系统中,甲方要求将MySql替换成Oracle,那么系统中所有的关联的地方都要改。如果我们使用工厂方法,则只用替换对应的抽象工厂类即可
1、抽象数据库表(产品)
/**
* 部门表
*/
public abstract class IDept {
/**
* 创建部门
*/
public abstract void createDept();
}
/**
* 用户表
*/
public abstract class IUser {
/**
* 创建用户信息
*/
public abstract void createUser();
}
2、MySql数据库表
/**
* MySql部门
*/
public class MySqlDept extends IDept{
public void createDept(){
System.out.println("MySql创建部门");
}
}
/**
* MySql用户
*/
public class MySqlUser extends IUser{
/**
* 创建用户信息
*/
public void createUser(){
System.out.println("MySql创建用户");
}
}
3、Oracle数据库表
/**
* Oracle部门
*/
public class OracleDept extends IDept{
public void createDept(){
System.out.println("Oracle创建部门");
}
}
/**
* Oracle用户
*/
public class OracleUser extends IUser{
/**
* 创建用户信息
*/
public void createUser(){
System.out.println("Oracle创建用户");
}
}
3、抽象工厂
/**
* 抽象工厂
*/
public abstract class IFactory {
/**
* 创建用户信息
*/
public abstract void createUser();
/**
* 创建部门
*/
public abstract void createDept();
}
/**
* MySql工厂
*/
public class MySqlFactory extends IFactory{
/**
* 创建MySql用户
*/
public void createUser(){
new MySqlUser().createUser();
}
/**
* 创建MySql部门
*/
public void createDept(){
new MySqlDept().createDept();
}
}
/**
* Oracle工厂
*/
public class OracleFactory extends IFactory{
/**
* 创建Oracle用户
*/
public void createUser(){
new OracleUser().createUser();
}
/**
* 创建Oracle部门
*/
public void createDept(){
new OracleDept().createDept();
}
}
4、测试
/**
* 测试抽象工厂模式
*/
public class TestAbstracFactory {
public static void main(String [] args){
IFactory factory = new OracleFactory();
factory.createUser();
factory.createDept();
}
}
测试结果:
对比抽象工厂模式和工厂方法模式的区别在于,工厂方法模式只创建一个具体类对象,而抽象工厂模式,是用于创建一组相关的类的对象。