反射与工厂模式设计
package cn.cccc.demo;import java.lang.reflect.InvocationTargetException;interface IService{ public void service();}class HouseService implements IService{ @Override public void service() { System.out.println("【服务】:为您的住宿提供服务"); }}interface IMessage{ public void send();}class CloudMessage implements IMessage{35 collapsed lines
@Override public void send() { // TODO Auto-generated method stub System.out.println("[消息]:发送一个云消息"); }}class Factory{ private Factory(){} //没有产生实例化对象,所以构造对象私有化 @SuppressWarnings("unchecked")
/** * 获取接口实例化对象,利用泛型去传值很重要 * @param className 接口的子类 * @param clazz 描述的是一个接口的类型 * @return 如果子类存在则返回接口实例化对象 */ public static <T> T getInstance(String className, Class<T> clazz){ T instance = null; try { instance = (T)Class.forName(className).getDeclaredConstructor().newInstance(); } catch (Exception e) { e.printStackTrace(); } return instance; }}public class Demo { public static void main(String[] args) throws Exception { IMessage msg = Factory.getInstance("cn.cccc.demo.CloudMessage", IMessage.class); msg.send(); IService ser = Factory.getInstance("cn.cccc.demo.HouseService", IService.class); ser.service();
}}反射与单例设计模式
package cn.cccc.demo;class Singleton{ // 这里必须设置volatile 这样可以让其他线程的单例与主线程保持同步 private static volatile Singleton instance = null; private Singleton(){ System.out.println("*****"+Thread.currentThread().getName()+"实例化Singleton*****"); } // 不能给方法设置synchorized,这样的话会卡住其他线程只让一个线程进来 public static Singleton getInstance(){ if(instance == null){ // 这样所有线程都可以不阻塞的进来,但是必须在里面重新判断instance是否为空 synchronized (Singleton.class) { if(instance == null ){ instance = new Singleton(); }19 collapsed lines
} } return instance; }
public void print(){ System.out.println("www.ccc.cn"); }}public class Demo { public static void main(String[] args) throws Exception { for(int x =0; x < 3; x++){ new Thread(()->{ Singleton.getInstance().print(); },"单例消费端"+x).start(); }
}}