看一个Demo,有一个接口UserService,两个实现类UserServiceImpl,UserServiceImpl2
package cn.demo;
public interface UserService {
public abstract void findUsers();
}
package cn.demo
public class UserServiceImpl implements UserService {
@Override
public void findUsers() {
System.out.println("查找所有用户...");
}
}
package cn.demo
public class UserServiceImpl2 implements UserService {
@Override
public void findUsers() {
System.out.println("查找所有用户并排序...");
}
}
1、普通做法
package cn.demo
public class FactoryTest {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
// UserService userService = new UserServiceImpl2();
userService.findUsers();
}
}
当我们使用实现类UserServiceImpl时,需要在代码中使用new关键字创建,当我们想使用实现类UserServiceImpl2时,不得不更改代码,使用new关键字创建UserServiceImpl2的实例。下面看工厂模式的做法
2、工厂模式
工厂类
package cn.demo.utils;
import java.util.ResourceBundle;
public class MyFactoryUtils {
@SuppressWarnings("all")
public static <T> T getInstance(Class<T> c) {
// 获取接口类名
String interfaceName = c.getSimpleName();
// 加载配置文件,获取接口实现类的包名.类名 ,ResourceBundle用于读取src目录下的properties文件
String interfaceImplName = ResourceBundle.getBundle("myinterface").getString(interfaceName);
// 返回实例对象
try {
return (T) Class.forName(interfaceImplName).newInstance();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e + "加载接口实例失败");
}
}
}
同时在src目录下创建myinterface.properties文件,并配置
UserService=cn.demo.UserServiceImpl
使用
package cn.demo;
public class FactoryTest {
public static void main(String[] args) {
UserService userService = MyFactoryUtils.getInstance(UserService.class);
userService.findUsers();
}
}
这样如果想使用另一个实现类,只需要更改配置文件就可以了
UserService=cn.demo.UserServiceImpl2