相对于开始讲的简单工厂模式和工厂方法模式,抽象工厂模式则是进一步抽象我觉得。
比如在之前的需求上,进一步增加需求,整个需求在原需求的范围之外。
很平常的一个例子就是更换数据库,你的dao层代码可能会要大改,因为
大部分数据库语言会有差异。
当然这里插入一点,如果使用框架的话,可能改动的较少,比如hibernate,他都帮你封装好了,
其实也改了,只是是hibernate帮你改好了,你不用改而已。
今天的代码需求是基于一个换数据库的角度,如果要同时支持两个数据库sqlserver以及access,
则应该由哪种数据模式实现。
下面看类图吧:
和之前简单工厂和工厂方法的类图可以比较出,开始的简单工厂模式,仅仅是把Factory类抽象一层,以增加可以生成不同的工厂。
而工厂方法则是把左边某一个也抽象出来,与工厂关联起来。
但是抽象工厂,则是左边有两个不同的接口规范,并且对应着右边的工厂类。
下面看具体类:
UserService类:
package com.blog.anla.AbstractFactory;
/**
* 用户表接口
* @author U-ANLA
*
*/
public interface UserService {
public void insert(User user);
}
AccessUser类:
package com.blog.anla.AbstractFactory;
public class AccessUser implements UserService{
@Override
public void insert(User user) {
System.out.println("在access中插入user表");
}
}
SqlserverUser类:
package com.blog.anla.AbstractFactory;
public class SqlserverUser implements UserService{
@Override
public void insert(User user) {
System.out.println("在sqlserver中 插入user表");
}
}
DepartmentService类:
package com.blog.anla.AbstractFactory;
/**
* 部门表接口
* @author U-ANLA
*
*/
public interface DepartmentService {
public void insert(Department department);
}
AccessDepartment类:
package com.blog.anla.AbstractFactory;
public class AccessDepartment implements DepartmentService{
@Override
public void insert(Department department) {
System.out.println("在 access中插入department!");
}
}
SqlserverDepartment类:
package com.blog.anla.AbstractFactory;
public class SqlserverDepartment implements DepartmentService{
@Override
public void insert(Department department) {
System.out.println("在 sqlserver中插入department!");
}
}
Factory类:
package com.blog.anla.AbstractFactory;
/**
* 工厂接口
* @author U-ANLA
*
*/
public interface Factory {
public UserService createUser();
public DepartmentService createDepartment();
}
AccessFactory类:
package com.blog.anla.AbstractFactory;
/**
* access工厂
* @author U-ANLA
*
*/
public class AccessFactory implements Factory{
@Override
public UserService createUser() {
return new AccessUser();
}
@Override
public DepartmentService createDepartment() {
return new AccessDepartment();
}
}
SqlserverFactory类:
package com.blog.anla.AbstractFactory;
/**
* sqlserver工厂
* @author U-ANLA
*
*/
public class SqlserverFactory implements Factory{
@Override
public UserService createUser() {
return new SqlserverUser();
}
@Override
public DepartmentService createDepartment() {
return new SqlserverDepartment();
}
}
代码类有点多,看类图理解直接些哈。
赠人玫瑰手留余香(oo)