一、工厂方法实现

/** * 对应数据库User表的实体类 */
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.两种不同的数据库 各自有各自的操作语句

/** * 数据表User操作接口 */
public interface IUser {
    void insert(User user);

    void getUser(int id);
}
/** * 使用SQLServer数据库操作User表 */
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);
    }
}
/** * 使用Access数据库操作User表 */
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 {
    //生成一个User工厂
    IUser creteUser();
}
/** * SqlServer工厂 */
public class SqlServerFactory implements IFactory {
    @Override
    public IUser creteUser() {
        return new SqlServerUser();
    }
}
/*** * Access工厂 */
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();
// IFactory factory = new AccessFactory();
        IUser iUser = factory.creteUser();
        iUser.insert(user);
        iUser.getUser(1);
    }
}

二、抽象工厂实现

在上面的工厂方法的基础上 添加部门实体类 此时要增加对该表的不同数据库的操作

/** * 对应数据库Department表的实体类 */
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 {
    //生成一个User工厂
    IUser creteUser();

    //生成一个Department工厂
    IDepartment creteDepartment();
}
/** * SqlServer工厂 */
public class SqlServerFactory implements IFactory {
    @Override
    public IUser creteUser() {
        return new SqlServerUser();
    }

    @Override
    public IDepartment creteDepartment() {
        return new SqlServerDepartment();
    }
}
/*** * Access工厂 */
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 SqlServerFactory();
        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 final String DB = "Access";
    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);
    }
}
  • 工厂方法模式:
  1. 一个抽象产品类,可以派生出多个具体产品类。
  2. 一个抽象工厂类,可以派生出多个具体工厂类。
  3. 每个具体工厂类只能创建一个具体产品类的实例。
  • 抽象工厂模式:
  1. 多个抽象产品类,每个抽象产品类可以派生出多个具体产品
    类。
  2. 一个抽象工厂类,可以派生出多个具体工厂类。
  3. 每个具体工厂类可以创建多个具体产品类的实例。
  • 区别:
  1. 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
  2. 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,
    而抽象工厂模式可以创建多个