定义
UML类图
简单实现
最基本的数据访问程序
User表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| public class User { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
|
SqlServerUser类
1 2 3 4 5 6 7 8 9 10 11
| public class SqlServerUser { private static final String TAG = "SqlServerUser"; public void insertUser(User user){ Log.d(TAG, "insert: 在SQL Server中录入一个用户记录"); } public User getUser(int id){ Log.d(TAG, "getUser: 在SQL Server中获取一个用户记录"); return null; } }
|
客户端调用
1 2 3 4 5 6
| User user = new User(); user.setId(1); user.setName("Allever"); SqlServerUser sqlServerUser = new SqlServerUser(); sqlServerUser.insertUser(user); sqlServerUser.getUser(1);
|
如果换为MySQL数据库改动就很多
使用工厂方法改进
IUser接口
1 2 3 4
| public interface IUser { void insertUser(User user); User getUser(int id); }
|
SqlServerUser类
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public class SqlServerUser implements IUser { private static final String TAG = "SqlServerUser"; @Override public void insertUser(User user){ Log.d(TAG, "insert: 在SQL Server中录入一个用户记录"); } @Override public User getUser(int id){ Log.d(TAG, "getUser: 在SQL Server中获取一个用户记录"); return null; } }
|
MySQLUser类
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class MySQLUser implements IUser { private static final String TAG = "MySQLUser"; @Override public void insertUser(User user){ Log.d(TAG, "insert: 在MySQL Server中录入一个用户记录"); } @Override public User getUser(int id){ Log.d(TAG, "getUser: 在MySQL Server中获取一个用户记录"); return null; } }
|
IFactory抽象工厂接口
1 2 3
| public interface IFactory { IUser createUser(); }
|
SqlServerFactory具体工厂类
1 2 3 4 5 6
| public class SqlServerFactory implements IFactory { @Override public IUser createUser() { return new SqlServerUser(); } }
|
MySQLServerFactory具体工厂
1 2 3 4 5 6
| public class MySQLServerFactory implements IFactory { @Override public IUser createUser() { return new MySQLUser(); } }
|
客户端调用
1 2 3 4 5 6 7 8
| User user = new User(); user.setId(1); user.setName("Allever"); IFactory factory = new SqlServerFactory(); IUser iUser = factory.createUser(); iUser.insertUser(user); iUser.getUser(1);
|
如果改为MySQL数据库,这改动这里
1
| IFactory factory = new MySQLServerFactory();
|
使用抽象工厂
新增Department表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| public class Department { private int id; private String deptName; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getDeptName() { return deptName; } public void setDeptName(String deptName) { this.deptName = deptName; } }
|
新增IDepartment接口
1 2 3 4
| public interface IDepartment { void insertDepartment(Department department); Department getDepartment(int id); }
|
新增SqlServerDepartment类
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class SqlServerDepartment implements IDepartment { private static final String TAG = "SqlServerDepartment"; @Override public void insertDepartment(Department department) { Log.d(TAG, "insertDepartment: 在Sql Server 中插入Department"); } @Override public Department getDepartment(int id) { Log.d(TAG, "insertDepartment: 在Sql Server 中获取Department"); return null; } }
|
新增MySQLDepartment类
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class MySQLDepartment implements IDepartment { private static final String TAG = "MySQLDepartment"; @Override public void insertDepartment(Department department) { Log.d(TAG, "insertDepartment: 在MySQL 中插入Department"); } @Override public Department getDepartment(int id) { Log.d(TAG, "insertDepartment: 在MySQL 中获取Department"); return null; } }
|
修改IFactory接口
1 2 3 4
| public interface IFactory { IUser createUser(); IDepartment createDepartment(); //新增 }
|
修改SqlServerFactory类
1 2 3 4 5 6 7 8 9 10 11
| public class SqlServerFactory implements IFactory { @Override public IUser createUser() { return new SqlServerUser(); } @Override public IDepartment createDepartment() { return new SqlServerDepartment(); } }
|
修改MySQLServerFactory类
1 2 3 4 5 6 7 8 9 10 11
| public class MySQLServerFactory implements IFactory { @Override public IUser createUser() { return new MySQLUser(); } @Override public IDepartment createDepartment() { return new MySQLDepartment(); } }
|
客户端调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| User user = new User(); user.setId(1); user.setName("Allever"); Department department = new Department(); department.setId(1); department.setDeptName("Computer"); IFactory factory = new MySQLServerFactory(); IUser iUser = factory.createUser(); iUser.insertUser(user); iUser.getUser(1); IDepartment iDepartment = factory.createDepartment(); iDepartment.insertDepartment(department); iDepartment.getDepartment(1);
|
总结
只有一个User类和User操作类的时候,只需要工厂方法模式, 但现在数据库中有很多表, 而SQL Server 和 MySQL 又是两大不同的分类, 所以解决这种涉及到多个产品系列的时候,就要用到抽象工厂模式。