代码的魔法师:Java反射工厂模式详解

简介: 代码的魔法师:Java反射工厂模式详解

定义实体类

package world.xuewei;
/**
 * 用户实体
 *
 * @author 薛伟
 * @since 2023/9/14 17:17
 */
public class User {
    /**
     * 用户名
     */
    private String userName;
    /**
     * 密码
     */
    private String password;
    public User() {
    }
    public User(String userName, String password) {
        this.userName = userName;
        this.password = password;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return "User{" +
                "userName='" + userName + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

定义服务接口

package world.xuewei;
/**
 * 用户服务接口
 *
 * @author 薛伟
 * @since 2023/9/14 17:17
 */
public interface UserService {
    /**
     * 用户登录
     *
     * @param userName 用户名
     * @param password 密码
     * @return 登录用户
     */
    User login(String userName, String password);
}

定义服务实现类

package world.xuewei;
/**
 * 用户服务接口实现类
 *
 * @author 薛伟
 * @since 2023/9/14 17:19
 */
public class UserServiceImpl implements UserService {
    @Override
    public User login(String userName, String password) {
        System.out.println("当前登录用户为:" + userName);
        return new User(userName, password);
    }
}

定义工厂类

package world.xuewei;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
 * 工厂类
 *
 * @author 薛伟
 * @since 2023/9/14 17:23
 */
public class BeanFactory {
    /**
     * 存储配置文件内容
     */
    private static final Properties properties = new Properties();
    static {
        // 加载配置文件内容
        try (InputStream inputStream = BeanFactory.class.getResourceAsStream("/bean.properties")) {
            properties.load(inputStream);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    /**
     * 获取 Bean 对象
     *
     * @return 服务实现类
     */
    public static Object getBean(String beanName) {
        Object bean = null;
        try {
            // 通过全限定类名反射创建对象
            Class<?> userServiceClass = Class.forName(String.valueOf(properties.get(beanName)));
            bean = userServiceClass.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bean;
    }
}

测试方法

package world.xuewei;
/**
 * 主方法
 *
 * @author 薛伟
 * @since 2023/9/14 17:21
 */
public class MainApp {
    public static void main(String[] args) {
        UserService userService = (UserService) BeanFactory.getBean("userService");
        userService.login("张三", "123456");
    }
}

配置文件

# bean.properties
userService=world.xuewei.UserServiceImpl


相关文章
|
7天前
|
设计模式 Java
Java一分钟之-设计模式:工厂模式与抽象工厂模式
【5月更文挑战第17天】本文探讨了软件工程中的两种创建型设计模式——工厂模式和抽象工厂模式。工厂模式提供了一个创建对象的接口,延迟实例化到子类决定。过度使用或违反单一职责原则可能导致问题。代码示例展示了如何创建形状的工厂。抽象工厂模式则用于创建一系列相关对象,而不指定具体类,但添加新产品可能需修改现有工厂。代码示例展示了创建颜色和形状的工厂。根据需求选择模式,注意灵活性和耦合度。理解并恰当运用这些模式能提升代码质量。
22 2
|
1天前
|
SQL Java 数据处理
实时计算 Flink版产品使用合集之在生产运行方式中是嵌入java代码还是在客户端
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
2天前
|
存储 Java 测试技术
滚雪球学Java(37):深入了解Java方法作用域和生命周期,让你写出更高效的代码
【5月更文挑战第12天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
11 0
滚雪球学Java(37):深入了解Java方法作用域和生命周期,让你写出更高效的代码
|
3天前
|
Java 编译器
滚雪球学Java(36):玩转Java方法重载和可变参数,让你的代码更灵活
【5月更文挑战第11天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
9 0
滚雪球学Java(36):玩转Java方法重载和可变参数,让你的代码更灵活
|
5天前
|
Java 测试技术
如何提高Java代码的可读性
Java是一种常用的编程语言,但是写出易懂且可读性高的代码却是一项挑战。本文将分享一些技巧和建议,帮助您提高Java代码的可读性和可维护性。
|
7天前
|
安全 Java API
JAVA-不安全的反射--RCE
JAVA不安全的反射造成的RCE小案例
|
9天前
|
Java Kotlin
java调用kotlin代码编译报错“找不到符号”的问题
java调用kotlin代码编译报错“找不到符号”的问题
20 10
|
9天前
|
前端开发 Java Spring
Java Web ——MVC基础框架讲解及代码演示(下)
Java Web ——MVC基础框架讲解及代码演示
16 1
|
9天前
|
设计模式 前端开发 网络协议
Java Web ——MVC基础框架讲解及代码演示(上)
Java Web ——MVC基础框架讲解及代码演示
10 0
|
9天前
|
Java
Java的取余如何编写代码
【5月更文挑战第9天】Java的取余如何编写代码
24 5