23种设计模式创建型模式
单例模式
饿汉式
-
使对象私有化
-
类初始化的时候立即加载该对象
-
提供获取该对象的方法,没有sysnchronized,效率高
1.
private T07(){
}
2.
private static T07 instance=new T07();
3.
public static T07 getInstance(){
return instance;
}
缺点,如果开辟空间,将造成空间浪费,不管用到没有都会开辟空间。不能延时加载
优点:线程安全,调用效率高
懒汉式
-
私有化构造器
-
类初始化的时候不立即加载该对象
-
有sysnchronized,效率不高
1.
private T08(){
}
2.
private static T08 instance;
3.
public static synchronized T08 getInstance(){
if (instance==null){
instance=new T08();
}
return instance;
优点:线程安全,可以延时加载
缺点:调用效率不高
DCL懒汉式
把锁的位置变了,不建议使用,极端情况容易出错
private T09(){
}
private static T09 instance;
public static T09 getInstance(){
if (instance==null){
synchronized (T09.class) {
instance = new T09();
}
}
return instance;
}
饿汉式改进
线程安全,且用final保证只有一个实例存在
private T10(){};
private static class InnerClass{
private static final T10 instance=new T10();
}
public static T10 getInstance(){
return InnerClass.instance;
}
反射可以破话任何单例模式
改进:1,监测对象是否被创建
private T09(){
synchronized (T09.class){
if (instance!=null){
throw new RuntimeException("不要试图用反射破坏单例模式");
}
}
}
2.进一步改进,已经很安全了 不过反射还可以破坏boolean的值
private static boolean flag=false;
private T09(){
synchronized (T09.class){
if (flag=false){
flag=true;
}
else {
throw new RuntimeException("不要试图用反射破坏单例模式");
}
}
}
枚举单例
简单高效安全
public enum T11 {
INSTANCE;
public T11 getInstance(){
return INSTANCE;
}
}

浙公网安备 33010602011771号