一、工厂方法实现

public class User {
private int id;
private String name;
public User(int id, String name) {
this.id = id;
this.name = name;
}
public User() {
}
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;
}
}
1.两种不同的数据库 各自有各自的操作语句
public interface IUser {
void insert(User user);
void getUser(int id);
}
public class SqlServerUser implements IUser {
@Override
public void insert(User user) {
System.out.println("SQLServer --> INSERT INTO user( id , name ) VALUES( " + user.getId() + " , " + user.getName() + " )");
}
@Override
public void getUser(int id) {
System.out.println("SQLServer --> SELECT * FROM user WHERE ID = " + id);
}
}
public class AccessUser implements IUser {
@Override
public void insert(User user) {
System.out.println("Access --> INSERT INTO user( id , name ) VALUES( " + user.getId() + " , " + user.getName() + " )");
}
@Override
public void getUser(int id) {
System.out.println("Access --> SELECT * FROM user WHERE ID = " + id);
}
}
2.两种不同的工厂 用来生成不同的数据库操作实例
public interface IFactory {
IUser creteUser();
}
public class SqlServerFactory implements IFactory {
@Override
public IUser creteUser() {
return new SqlServerUser();
}
}
public class AccessFactory implements IFactory {
@Override
public IUser creteUser() {
return new AccessUser();
}
}
测试
public class Main {
public static void main(String[] args) {
User user = new User(1, "大神");
IFactory factory = new SqlServerFactory();
IUser iUser = factory.creteUser();
iUser.insert(user);
iUser.getUser(1);
}
}
二、抽象工厂实现
在上面的工厂方法的基础上 添加部门实体类 此时要增加对该表的不同数据库的操作
public class Department {
private int id;
private String name;
public Department() {
}
public Department(int id, String name) {
this.id = id;
this.name = 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;
}
}
1.两种不同的数据库 各自有各自的操作语句
public interface IDepartment {
void insert(Department department);
void getDepartment(int id);
}
public class SqlServerDepartment implements IDepartment {
@Override
public void insert(Department department) {
System.out.println("SQLServer --> INSERT INTO department( id , name ) VALUES( " + department.getId() + " , " + department.getName() + " )");
}
@Override
public void getDepartment(int id) {
System.out.println("SQLServer --> SELECT * FROM department WHERE ID = " + id);
}
}
public class AccessDepartment implements IDepartment {
@Override
public void insert(Department department) {
System.out.println("Access --> INSERT INTO department( id , name ) VALUES( " + department.getId() + " , " + department.getName() + " )");
}
@Override
public void getDepartment(int id) {
System.out.println("Access --> SELECT * FROM department WHERE ID = " + id);
}
}
2.在两种不同的工厂里添加对Department的生成方法
public interface IFactory {
IUser creteUser();
IDepartment creteDepartment();
}
public class SqlServerFactory implements IFactory {
@Override
public IUser creteUser() {
return new SqlServerUser();
}
@Override
public IDepartment creteDepartment() {
return new SqlServerDepartment();
}
}
public class AccessFactory implements IFactory {
@Override
public IUser creteUser() {
return new AccessUser();
}
@Override
public IDepartment creteDepartment() {
return new AccessDepartment();
}
}
public class Main {
public static void main(String[] args) {
User user = new User(1, "小菜");
IFactory factory = new AccessFactory();
IUser iUser = factory.creteUser();
iUser.insert(user);
iUser.getUser(1);
Department department = new Department(1, "宣传部");
IDepartment iDepartment = factory.creteDepartment();
iDepartment.insert(department);
iDepartment.getDepartment(1);
}
}
三、简单工厂实现
1.去除IFactory、SqlServerFactory、AccessFactory,代替的是DataBase
public interface DataBase {
public static final String DB = "SQLServer";
public static IUser createUser() {
IUser iUser = null;
switch (DB) {
case "SQLServer":
iUser = new SqlServerUser();
break;
case "Access":
iUser = new AccessUser();
break;
default:
break;
}
return iUser;
}
public static IDepartment createDepartment() {
IDepartment iDepartment = null;
switch (DB) {
case "SQLServer":
iDepartment = new SqlServerDepartment();
break;
case "Access":
iDepartment = new AccessDepartment();
break;
default:
break;
}
return iDepartment;
}
}
2.其余不变,测试类:
public class Main {
public static void main(String[] args) {
User user = new User(1, "大神");
IUser iUser = DataBase.createUser();
iUser.insert(user);
iUser.getUser(1);
Department department = new Department(1, "宣传部");
IDepartment iDepartment = DataBase.createDepartment();
iDepartment.insert(department);
iDepartment.getDepartment(1);
}
}
- 一个抽象产品类,可以派生出多个具体产品类。
- 一个抽象工厂类,可以派生出多个具体工厂类。
- 每个具体工厂类只能创建一个具体产品类的实例。
- 多个抽象产品类,每个抽象产品类可以派生出多个具体产品
类。 - 一个抽象工厂类,可以派生出多个具体工厂类。
- 每个具体工厂类可以创建多个具体产品类的实例。
- 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
- 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,
而抽象工厂模式可以创建多个