工厂模式+反射工厂
程序员文章站
2022-03-09 21:57:32
...
工厂模式
优点:解耦合
使用方法:通过工厂类来创建 *接口实现类
传统代码编写方式:
①定义接口-UserService
public interface UserService {
void login(String name,String password);
void register(User user);
}
②定义实现类-UserServiceImp1
public class UserServiceImp1 implements UserService {
@Override
public void login(String name, String password) {
System.out.println("name:"+name+",password:"+password);
}
@Override
public void register(User user) {
System.out.println(user.toString());
}
}
③使用
@Test
public void abc(){
//创建对象
UserService userService = new UserServiceImp1();
userService.login("name","password");
User user = new User("eason","fukua");
userService.register(user);
}
可以看出耦合在UserService userService = new UserServiceImp1();
中(若UserServiceImp1()
实现类的名字发生改变,则需要修改的地方太多了。A.java或者B.java或者C.java如果都用了,那么都要Ctrl+C Ctrl+V)如果可以只修改一处,就可以达到修改所有,那就好了!
简单工厂实现
①定义工厂类
public class BeanFactory {
public static UserService getUserServiceImp1(){
return new UserServiceImp1();
}
}
②使用
public void abc(){
//创建对象
UserService userService = BeanFactory.getUserServiceImp1();
userService.login("name","password");
User user = new User("eason","fukua");
userService.register(user);
}
可以有效防止耦合,可是在步骤一中。return new UserServiceImp1();
还是会出现耦合。(若多个工厂都返回UserServiceImp1()
)那就要修改很多。
有没有更好的方法?
反射工厂
将工厂类中的定义方法改成反射
①修改工厂类定义方法
public static UserService getUserServiceImp1() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
UserService userService;
Class clazz = Class.forName("com.example.studyspring0904.Imp.UserServiceImp1.java");
userService = (UserService)clazz.newInstance();
return userService;
}
②测试
public void abc() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
//创建对象
UserService userService = BeanFactory.getUserServiceImp1();
userService.login("name","password");
User user = new User("eason","fukua");
userService.register(user);
}
运用配置文件来完善反射工厂
①创建applaction.properties
在resources文件夹内
kv形式 写入
userService = com.example.studyspring0904.Imp.UserServiceImp1
②在工厂类中载入配置文件
public class BeanFactory {
public static Properties env = new Properties();
// 建一个静态的配置文件类
static {
// 第一步 获得IO输入流
InputStream resourceAsStream = BeanFactory.class.getResourceAsStream("/application.properties");
// 第二步 文件内容封装Properties集合中,key=userService
try {
env.load(resourceAsStream);
resourceAsStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static UserService getUserServiceImp1() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
UserService userService;
Class clazz = Class.forName(env.getProperty("userService"));
// 指定配置文件中的K V,
userService = (UserService)clazz.newInstance();
return userService;
}
}
这样以后修改 就可以只对application.properties
中的userService = com.example.studyspring0904.Imp.UserServiceImp1
修改