简单讲述业务需求
业务需要根据不同的类型返回不同的用户列表,比如按角色查询用户列表、按机构查询用户列表,用户信息需要从数据库中查询,因为不同的类型查询的逻辑不相同,因此简单用工厂模式来设计一下;
首先新建一个返回用户列表的接口
/**
 * 定义一个返回的用户列表接口
 * @author sinder
 * @date 2024/5/7 22:15
 */
public interface ReturnUser {
    List<String> getUserByType();
} 
再分别新建返回机构用户列表和角色用户列表的实现类
这里简化一下,执行的sql操作是测试表的,返回的数据固定的;
/**
 * @author sinder
 * @date 2024/5/7 22:29
 */
@Component
public class OrgUserImpl implements ReturnUser {
    @Autowired
    private TbTestMapper tbTestMapper;
    /**
     * 返回按机构返回的用户
     * @return
     */
    @Override
    public List<String> getUserByType() {
        System.out.println("按机构返回用户列表");
        ArrayList<String> list = new ArrayList<>();
        list.add("org1");
        list.add("org2");
        list.add("org3");
        List<TbTest> tbTests = tbTestMapper.getList();
        System.out.println(tbTests);
        return list;
    }
} 
/**
 * 用户工厂实现类
 * @author sinder
 * @date 2024/5/7 22:14
 */
@Component
public class RoleUserImpl implements ReturnUser {
    @Autowired
    private TbTestMapper tbTestMapper;
    /**
     * 按角色用户返回
     * @return
     */
    @Override
    public List<String> getUserByType() {
        System.out.println("按角色返回用户列表");
        ArrayList<String> list = new ArrayList<>();
        list.add("role1");
        list.add("role2");
        list.add("role3");
        List<TbTest> tbTests = tbTestMapper.getList();
        System.out.println(tbTests);
        return list;
    }
} 
然后新建一个工厂类
/**
 * 返回用户工厂
 * @author sinder
 * @date 2024/5/7 22:31
 */
@Component
public class ReturnUserFactory {
    @Autowired
    private RoleUserImpl roleUser;
    @Autowired
    private OrgUserImpl orgUser;
    public ReturnUser getUserList(String module) {
        switch (UserType.customValueOf(module)) {
            case ROLE:
                return roleUser;
            case ORG:
                return orgUser;
            default:
                return null;
        }
    }
} 
这里用到了枚举,并重写了valueOf(),以下:
/**
 * @author sinder
 * @date 2024/5/7 22:33
 */
public enum UserType {
    ORG("org"),
    ROLE("role");
    private final String name;
    UserType(String name) {
        this.name = name;
    }
    // 重写valueOf方法
    public static UserType customValueOf(String text) {
        for (UserType userType : UserType.values()) {
            if (userType.name.equalsIgnoreCase(text)) {
                return userType;
            }
        }
        throw new IllegalArgumentException("No constant with name " + text + " found");
    }
} 
测试
@Test
    public void testReturnUser() {
        List<String> orgList = returnUserFactory.getUserList("org").getUserByType();
        List<String> roleList = returnUserFactory.getUserList("role").getUserByType();
        System.out.println(orgList);
        System.out.println(roleList);
    } 

简单应用一下设计模式,具体关于工厂模式和单例模式的介绍和使用可以看以下详细博客说明
(超详细)JAVA设计模式:单例模式和工厂模式
简单记录,有更好的想法可以评论区指导一波!!!






![【Linux】-IP地址、主机名配置[5]](https://img-blog.csdnimg.cn/direct/21261dea6b6d4d4f866b70a20fbc7203.png)












