目的是用几行代码来解决不断重复new 对象的过程,可以大大的简化代码,提高代码的可用性。
这里用到反射和泛型。
注意:类名.class 等价于new 一个对象 Class.forName(字符) 可以加载一个对象
在JDK-1.9之后,用这样的方法来实例化对象: Class.forName(className).getDeclaredConstructor().newInstance();
代码:
package com.mldn.demo;
import java.lang.reflect.InvocationTargetException;
public class JavaDemo {
public static void main(String[] args) {
IMessage msg= Factory.getInstance("com.mldn.demo.NetMessage",IMessage.class);
msg.send();
Service service=Factory.getInstance("com.mldn.demo.HouseService", Service.class);
service.service();
}
}
interface IMessage{
public void send();
}
interface Service{
public void service();
}
class HouseService implements Service{
@Override
public void service() {
// TODO Auto-generated method stub
System.out.println("[服务]很高兴为你服务");
}
}
class NetMessage implements IMessage{
@Override
public void send() {
// TODO Auto-generated method stub
System.out.println("[网络消息发送]www.mldn.cn");
}
}
/*
* 工厂设计模式
*
*
* 获取接口的实例化对象
* @param className 接口的子类
* @param clazz 描述的是接口的一个类型
*
* */
class Factory{
private Factory() {};//没有产生实例化的意义,故构造方法私有化
@SuppressWarnings("unchecked")
public static <T> T getInstance(String className,Class<T> clazz) {
T instance=null;
try {
instance=(T)Class.forName(className).getDeclaredConstructor().newInstance();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return instance;
}
}