工厂模式之三——抽象工厂模式

定义

抽象工厂模式:提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类。

工厂模式是用来创建同一个产品的不同类型的,但是抽象工厂模式是用来创建一系列类的产品。产品种类单一,适合用工厂模式;如果有多个种类,各种类型时,通过抽象工厂模式来进行创建是很合适的。

结构图

这里写图片描述

实例:

设计一个部门人员的管理系统(后续可能会更改数据库的类型)。

类图
这里写图片描述
编码实现:
IFactory类:

public interface IFactory {

    public IUserDao createUserDao();

    public IDepartmentDao createDepartmentDao();

}

当数据库是MySQL时,生产操作一系列产品的工厂类
MySQLFactory 类:

public class MySQLFactory implements IFactory{

    @Override
    public IUserDao createUserDao() {
        return new MySQLUserDao();
    }

    @Override
    public IDepartmentDao createDepartmentDao() {
        return new MySQLDepartmentDao();
    }

}

当数据库是Oracle时,生产操作一系列产品的工厂类
OracleFactory类:

public class OracleFactory implements IFactory {

    @Override
    public IUserDao createUserDao() {
        return new OracleUserDao();
    }

    @Override
    public IDepartmentDao createDepartmentDao() {
        return new OracleDepartmentDao();
    }

}

操作用户类的接口
IUserDao接口:

public interface IUserDao {
    public void Insert(User user);

    public User getUser(int id);
}

数据库是MySQL时,User对应的操作类
MySQLUserDao 类

public class MySQLUserDao implements IUserDao{

    @Override
    public void Insert(User user) {
        System.out.println("在MySQL中的User表添加一条记录!");
    }

    @Override
    public User getUser(int id) {
        System.out.println("从MySQL中的User表中取出一条数据!");
        return null;
    }

}

数据库是Oracle时,User类对应的操作类
OracleUserDao

public class OracleUserDao implements IUserDao {

    @Override
    public void Insert(User user) {
        System.out.println("在Oracle中的User表中插入一条记录!");
    }

    @Override
    public User getUser(int id) {
        System.out.println("从Oracle中的User表中取出一条数据!");
        return null;
    }

}

操作部门类的接口
IDepartmentDao

public interface IDepartmentDao {
    public void insert(Department department);

    public Department getDepartment(int id);
}

数据库是MySQL时,Department对应的操作类
MySQLDepartmentDao 类

public class MySQLDepartmentDao implements IDepartmentDao{

    @Override
    public void insert(Department department) {
        System.out.println("在MySQL中的Department表添加一条记录!");

    }

    @Override
    public Department getDepartment(int id) {
        System.out.println("从MySQL中的Department表中取出一条数据!");
        return null;
    }

}

数据库是Oracle时,Department对应的操作类
OracleDepartmentDao 类

public class OracleDepartmentDao implements IDepartmentDao {

    @Override
    public void insert(Department department) {
        System.out.println("在Oracle中的Department表添加一条记录!");

    }

    @Override
    public Department getDepartment(int id) {
        System.out.println("从Oracle中的Department表中取出一条数据!");
        return null;
    }

}

客户端代码

public class Client {
    public static void main(String[] args) {
        IFactory factory = new MySQLFactory();

        IUserDao userDao = factory.createUserDao();
        IDepartmentDao departmentDao = factory.createDepartmentDao();

        //插入一个用户
        userDao.Insert(new User());

    }
}

优化(反射+抽象工厂类)

猜你喜欢

转载自blog.csdn.net/jdfk423/article/details/82388792