反射与工厂模式
1. 创建2个接口及对应两个实现类
interface IService{
void service();
}
class HouseService implements IService{
@Override
public void service() {
System.out.println("电视机服务");
}
}
interface IMessage{
void send();
}
class MyHell implements IMessage{
@Override
public void send() {
System.out.println("电脑服务");
}
}
2.工厂模式的设计
/**工厂设计*/
class Factory{
private Factory(){}
/**
* classname:接口的子类
* clazz:描述的是一个接口的类型
* return:如果子类存在则返回指定接口实列化对象
* */
public static <T> T getInstance(String classname,Class<T> clazz){
T instance = null;
try {
//反射获取对象JDK1.9前用newInstance()即可获取
//JDK1.9后用getDeclaredConstructor().newInstance()获得
instance = (T)Class.forName(classname).getDeclaredConstructor().newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return instance;
}
}
3.创建main方法测试
public class Test01 {
public static void main(String[] args) throws Exception {
Class<?> aClass = Class.forName("main.java.com.hqj.reflect.Person");
Object obj = aClass.getDeclaredConstructor().newInstance();
//工厂测试
IMessage msg = Factory.getInstance("main.java.com.hqj.reflect.MyHell", IMessage.class);
msg.send();
IService instance = Factory.getInstance("main.java.com.hqj.reflect.HouseService", IService.class);
instance.service();
}
}
4.测试结果
反射与懒汉单例模式设计
public class Singleton {
private Singleton() {}
//volatile:主要表示不需要副本,大大提高效率
private static volatile Singleton inser=null;
public static Singleton getInser() {
if (inser==null){
//synchronized:表示线程同步,保证多线程安全
synchronized (Singleton.class){
if (inser==null){
inser = new Singleton();
}
}
}
return inser;
}
}
2.测试结果