一、抽象工厂模式定义
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
二、抽象工厂模式结构图
增加部门,完成与用户相同的操作:
调整为简单工厂模式:
三、抽象工厂模式实例
1. 实现sql server 数据库用户增加、查询。创建一个操作sql server数据库的类,实现sql server增加、查询;
2. 增加oracle 数据库用户增加、查询。创建一个操作oracle数据库的类,实现oracle增加、查询。
3. 创建一个操作数据库的抽象类,让操作sql server数据库的类和操作oracle数据库的类,继承当前抽象类。
4. 创建工厂类,用于创建sql server数据库、oracle数据库的类对象;
5. 采用抽象工厂模式,让工厂类的子类去创建sql server数据库、oracle数据库的类对象(如果是工厂方法模式,应该是4个factory,保存用户的factory、查询用户的factory、保存部门的factory、查询部门的factory);
6. 增加部门操作,完成与用户操作一样的插入及查询。
7. 如果再次增加一套项目操作,需要增加很多类。所以调整为简单工厂模式。在factory中通过switch case 判断创建sql server 实例,还是创建oracle实例。
8. 通过反射+工厂代替switch case
userDaoClass =Class.forName("com.dhdesipatt.abstractfactory.abstractfactory_6." +dbStr + "UserDao");
Object obj = userDaoClass.newInstance(); // 实例化对象,和使用关键字new一样
userDao =(UserDao) obj ; // 向下转型
9. 通过反射+配置文件,代替switch case
Properties p=new Properties();
InputStreamis;
try {
is =PropertyParse.class.getResourceAsStream("db.properties");
p.load(is);
is.close();
db = p.getProperty("db");
} catch(Exception e) {
e.printStackTrace();
}
四、抽象工厂模式优点
符合设计模式之开闭原则、依赖倒置原则,
五、抽象工厂模式缺点
如果再增加另外一个表操作,则需要增加一套完成的类。
六、简单工厂模式、工厂方法模式、抽象工厂模式区别:
1. 简单工厂,只有一个工厂类,来创建用户操作类对象、部门操作类对象。如果需要增加项目操作类,则需要修改工厂类代码;
2. 工厂方法模式,每个工厂创建专门的类对象。如sql server 保存用户的类对象、sql server查询用户的类对象,oracle 保存用户的类对象,oracle查询用户的类对象;
3. 抽象工厂模式,每个工厂创建一类对象。如创建sql server保存用户、查询用户、保存部门、查询部门的类对象