之前学习过了简单工厂模式和工厂方法模式:这两个的区别其实就是在创建具体实例的时候,是放到一个工厂类下,还是分成多个工厂类,解决的问题就是遵循开放-关闭原则。今天要讲的是抽象工厂模式
解释:抽象工厂模式其实就是在工厂模式的基础上增加了需要实例化的抽象类
场景:对于数据使用不同类型的存储工具,mysql,sql-server,oracle,access
抽象工厂模式:
package factory.simplefactory;
public class ChangeSql {
public static void main(String[] args) {
ModelFactory modelFactory = new MySqlModelFactory();
DepModel depModel = modelFactory.createDepModel();
depModel.insert();
depModel.delete();
/**
* 使用mysql插入一个部门
* 使用mysql删除一个部门
*/
}
}
abstract class ModelFactory {
public abstract UserModel createUserModel();
public abstract DepModel createDepModel();
}
class MySqlModelFactory extends ModelFactory{
public UserModel createUserModel() {
return new UserModelMysql();
}
public DepModel createDepModel() {
return new DepModelMysql();
}
}
class AccessModelFactory extends ModelFactory{
public UserModel createUserModel() {
return new UserModelAccess();
}
public DepModel createDepModel() {
return new DepModelAccess();
}
}
abstract class UserModel {
public abstract void insert();
public abstract void delete();
}
class UserModelAccess extends UserModel {
public void insert() {
System.out.println("使用access插入一个用户");
}
public void delete() {
System.out.println("使用access删除一个用户");
}
}
class UserModelMysql extends UserModel {
public void insert() {
System.out.println("使用mysql插入一个用户");
}
public void delete() {
System.out.println("使用mysql删除一个用户");
}
}
abstract class DepModel {
public abstract void insert();
public abstract void delete();
}
class DepModelAccess extends DepModel {
public void insert() {
System.out.println("使用access插入一个部门");
}
public void delete() {
System.out.println("使用access删除一个部门");
}
}
class DepModelMysql extends DepModel {
public void insert() {
System.out.println("使用mysql插入一个部门");
}
public void delete() {
System.out.println("使用mysql删除一个部门");
}
}
简单工厂+抽象工厂+反射+配置文件
package factory.abstractfactory;
public class ChangeSql {
public static void main(String[] args) throws Exception {
//可以自行从配置文件中获取
String sql = "Access";
ModelFactory modelFactory = new ModelFactory();
UserModel userModel = modelFactory.createUserModel(sql);
userModel.insert();
userModel.delete();
/**
* 使用access插入一个用户
* 使用access删除一个用户
*/
}
}
class ModelFactory {
public UserModel createUserModel(String sql) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
UserModel userModel = (UserModel) Class.forName("factory.abstractfactory.UserModel" + sql).newInstance();
return userModel;
}
public DepModel createDepModel(String sql) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
DepModel depModel = (DepModel) Class.forName("factory.abstractfactory.DepModel" + sql).newInstance();
return depModel;
}
}
abstract class UserModel {
public abstract void insert();
public abstract void delete();
}
class UserModelAccess extends UserModel {
public void insert() {
System.out.println("使用access插入一个用户");
}
public void delete() {
System.out.println("使用access删除一个用户");
}
}
class UserModelMysql extends UserModel {
public void insert() {
System.out.println("使用mysql插入一个用户");
}
public void delete() {
System.out.println("使用mysql删除一个用户");
}
}
abstract class DepModel {
public abstract void insert();
public abstract void delete();
}
class DepModelAccess extends DepModel {
public void insert() {
System.out.println("使用access插入一个部门");
}
public void delete() {
System.out.println("使用access删除一个部门");
}
}
class DepModelMysql extends DepModel {
public void insert() {
System.out.println("使用mysql插入一个部门");
}
public void delete() {
System.out.println("使用mysql删除一个部门");
}
}