意图:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类
情景:接着上一个数据的例子,现在的需求是增加一张用户表,用抽象方式来实现
数据表Department
package createType.factory;
/**
* Created by LSX on 2018/5/10.
*/
public class Department {
private int id;
private String name;
public Department(int id, String name) {
this.id = id;
this.name = name;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
public interface IDepartment {
void insert(Department user);
void getUser();
}
public class SqlserverDepartment implements IDepartment{
public void insert(Department user){
Log.e("tag","SqlserverDepartment增加一条用户数据");
}
public void getUser(){
Log.e("tag","SqlserverDepartment获取一条用户数据");
}
}
public class AccessDepartment implements IDepartment{
public void insert(Department user){
Log.e("tag","AccessDepartment增加一条用户数据");
}
public void getUser(){
Log.e("tag","AccessDepartment获取一条用户数据");
}
}
修改原始类
public interface IFactory {
IUser createUser();
IDepartment createDepartment();//新增
}
public class SqlServerFactory implements IFactory {
@Override
public IUser createUser() {
return new SqlserverUser();
}
@Override
public IDepartment createDepartment() { //新增
return new SqlserverDepartment();
}
}
public class AccessFactory implements IFactory {
@Override
public IUser createUser() {
return new AccessUser();
}
@Override
public IDepartment createDepartment() { //新增
return new AccessDepartment();
}
}
调用
/**
* 抽象工厂
*/
private void abstractFactory() {
User user = new User(2, "布隆");
Department department = new Department(3, "妖姬");
IFactory acessfactory = new AccessFactory();
IUser iuser = acessfactory.createUser();
iuser.insert(user);
iuser.getUser();
IDepartment idepartment = acessfactory.createDepartment();
idepartment.insert(department);
idepartment.getUser();
}
代码确实有点多,下面再看一下用简单工厂对这个相同业务逻辑的精简版
一个工厂逻辑类替代其他所有工厂
public class DataAccess {
public static IUser createUser(String dbName){
switch (dbName){
case "SqlserverUser":
return new SqlserverUser();
case "AccessUser":
return new AccessUser();
}
return null;
}
public static IDepartment createDepartment(String dbName){
switch (dbName){
case "SqlserverDepartment":
return new SqlserverDepartment();
case "AccessDepartment":
return new AccessDepartment();
}
return null;
}
}
调用
IDepartment idepartment = acessfactory.createDepartment();
idepartment.insert(department);
idepartment.getUser();
IUser simpleIuser = DataAccess.createUser("SqlserverUser");
simpleIuser.insert(user);
simpleIuser.getUser();
IDepartment sqlserverDepartment = DataAccess.createDepartment("SqlserverDepartment");
sqlserverDepartment.insert(department);
sqlserverDepartment.getUser();
代码确实少了很多,而且逻辑清晰,但是大家发现没有,代码和数据量小还没问题,一旦遇到大项目,海量数据DB,这种方式会比抽象工厂麻烦很多,因为抽象工厂直接创建新类继承就可以,而简单工厂则需要去改动原始类的代码,还不止一处