1、单例模式:
单例模式A
效率最快开始加载的时候就优化。缺点就是没办法延迟加载
单例模式B
可以延迟加载但是由于使用了synchronized 效率下降。
单例模式C
通过内部类来加载,这样加载类的时候不会生成对象。而且内部类中也是加载时候完成,这样可以做到线程安全
最后说下单例模式可能失效的地方:
[color=red]1、反射类的私有方法。
2、进行序列化后在反序列化[/color]
2、使用代理模式来进行延迟加载
如果一个类加载的时候需要消耗大量的时间,我们可以对其进行延迟加载。用代理模式就可轻松完成。
sleep(1000)代表大量耗时等
这样就可以轻松实现,实际操作中我们可以使用动态代理等,当然也可以使用第三方的cglib与javassist,性能上来说cglib无论从生成代理类,还是调用动态方法都占优建议使用。
最后说一句hibernate的延迟加载就是通过cglib来实现的。
单例模式A
public class Singleton {
private Singleton() {
}
private static Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
}
效率最快开始加载的时候就优化。缺点就是没办法延迟加载
单例模式B
public class LazySingleton {
private LazySingleton() {
}
private static LazySingleton instance = null;
public static synchronized LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
可以延迟加载但是由于使用了synchronized 效率下降。
单例模式C
public class StaticSingleton {
private StaticSingleton(){
}
private static class SingletonHolder{
private static StaticSingleton instance = new StaticSingleton();
}
public static StaticSingleton getInstance(){
return SingletonHolder.instance;
}
}
通过内部类来加载,这样加载类的时候不会生成对象。而且内部类中也是加载时候完成,这样可以做到线程安全
最后说下单例模式可能失效的地方:
[color=red]1、反射类的私有方法。
2、进行序列化后在反序列化[/color]
2、使用代理模式来进行延迟加载
如果一个类加载的时候需要消耗大量的时间,我们可以对其进行延迟加载。用代理模式就可轻松完成。
public interface DBQuery {
String request();
}
public class DBQureyImpl implements DBQuery {
public DBQureyImpl() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public String request() {
return "string";
}
}
sleep(1000)代表大量耗时等
public class DBProxy implements DBQuery {
private DBQuery instance;
@Override
public String request() {
if (instance == null) {
instance = new DBQureyImpl();
}
return instance.request();
}
}
这样就可以轻松实现,实际操作中我们可以使用动态代理等,当然也可以使用第三方的cglib与javassist,性能上来说cglib无论从生成代理类,还是调用动态方法都占优建议使用。
最后说一句hibernate的延迟加载就是通过cglib来实现的。