抽象工厂模式,提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。我们以不同的数据库插入一条用户记录和部门为例子来看看抽象工厂模式的应用。
1、用户模型类和部门模型类
public class User {
private String _id;
private String _name;
public String get_id() {
return _id;
}
public void set_id(String _id) {
this._id = _id;
}
public String get_name() {
return _name;
}
public void set_name(String _name) {
this._name = _name;
}
}
public class Department {
private String _id;
private String _name;
public String get_id() {
return _id;
}
public void set_id(String _id) {
this._id = _id;
}
public String get_name() {
return _name;
}
public void set_name(String _name) {
this._name = _name;
}
}
2、定义用户操作接口和部门操作接口,包括插入和根据ID获得一条记录public interface IUser {
public void insert(User user);
public User getUser(int id);
}public interface IDepartment {
public void insert(Department department);
public Department getDepartment(int id);
}
3、分别用sqlserver数据库和access数据库实现用户操作接口和部门接口public class AccessUser implements IUser{
@Override
public void insert(User user) {
System.out.println("access 插入一条用户记录");
}
@Override
public User getUser(int id) {
System.out.println("access 根据Id获得一条用户记录");
return null;
}
}
public class SqlServerUser implements IUser{
@Override
public void insert(User user) {
System.out.println("sql server 插入一条用户记录");
}
@Override
public User getUser(int id) {
System.out.println("sql server 根据Id获得一条用户记录");
return null;
}
}
public class AccessDepartment implements IDepartment{
@Override
public void insert(Department department) {
System.out.println("access中插入一条部门数据");
}
@Override
public Department getDepartment(int id) {
System.out.println("access中根据id获得一条部门记录");
return null;
}
}
public class SqlServerDepartment implements IDepartment{
@Override
public void insert(Department department) {
System.out.println("sql server中插入一条部门数据");
}
@Override
public Department getDepartment(int id) {
System.out.println("sql server中根据id获得一条部门记录");
return null;
}
}
4、定义一个访问User表和部门表对象的抽象的工厂接口public interface IFactory {
IUser createUser();
IDepartment createDepartment();
}
5、实现IFactory接口,实例化SqlserverUser、SqlServerDepartment、AccessUser以及AccessDepartmentpublic class AccessFactory implements IFactory{
@Override
public IUser createUser() {
return new AccessUser();
}
@Override
public IDepartment createDepartment() {
return new AccessDepartment();
}
}
public class SqlServerFactory implements IFactory{
@Override
public IUser createUser() {
return new SqlServerUser();
}
@Override
public IDepartment createDepartment() {
return new SqlServerDepartment();
}
}
6、测试public class Test {
public static void main(String[] args) {
User user = new User();
Department department = new Department();
IFactory factory = new SqlServerFactory();
IUser iu = factory.createUser();
iu.insert(user);
iu.getUser(1);
IDepartment id = factory.createDepartment();
id.insert(department);
id.getDepartment(1);
}
}