23种设计模式创建型模式

设计模式

单例模式

饿汉式

  1. 使对象私有化

  2. 类初始化的时候立即加载该对象

  3. 提供获取该对象的方法,没有sysnchronized,效率高

1.

private T07(){

}

2.

private static T07 instance=new T07();

3.

public static T07 getInstance(){
   return instance;
}

缺点,如果开辟空间,将造成空间浪费,不管用到没有都会开辟空间。不能延时加载

优点:线程安全,调用效率高

懒汉式

  1. 私有化构造器

  2. 类初始化的时候不立即加载该对象

  3. 有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;
  }
}
posted @ 2020-03-03 14:52  坚持_第一天  阅读(137)  评论(0)    收藏  举报