6、单例模式 Singleton模式 只有一个实例 创建型模式

1Singleton

java . lang . string- -- -10001000西-- Singleton --Singleton

访访

使

使

Java

饿

2

getInstance线

getInstance2线使

package cn.design.single;


import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;

/**
* @author by lin
* @Classname LazyMan
* @Description 
* @Date 2020/4/12 16:36
* @Created in 2020/4/12 16:36 by lin
*/
public class LazyMan {
   // ,  
   private static boolean flag = false;

   // ,
   private LazyMan() {
       synchronized (LazyMan.class) {
           if (!flag) {
               flag = true;
          } else {
               throw new RuntimeException("使 ");
          }
      }
  }

   // 
   private volatile static LazyMan lazyMan = null;

   //线 
   public static LazyMan getInstance() {
       if (lazyMan == null) {
           lazyMan = new LazyMan();
      }
       return lazyMan;
  }

   //  
   public static LazyMan getInstance2() {
       if (lazyMan == null) {
           synchronized (LazyMan.class) {
               if (lazyMan == null) {
                   // 
                   lazyMan = new LazyMan();
                   // 
                   /*
                    * 
                    * 1
                    * 2
                    * 3
                    *
                    * 123 
                    * 132 
                    *     A 线 3
                    *     B 线 lazyMan  new 2    
                    *      volatile  
                    */
              }
          }
      }
       return lazyMan;
  }

   //   
   public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
       Field flag = LazyMan.class.getDeclaredField("flag");
       flag.setAccessible(true);
       Constructor<LazyMan> declaredConstructor = LazyMan.class.getDeclaredConstructor();
       declaredConstructor.setAccessible(true);
       LazyMan instance1 = declaredConstructor.newInstance();
       System.out.println(instance1);
       //   flag
       flag.set(instance1, false);
//       LazyMan instance = LazyMan.getInstance2();
//       System.out.println(instance);
       Constructor<LazyMan> declaredConstructor2 = LazyMan.class.getDeclaredConstructor();
       declaredConstructor2.setAccessible(true);
       LazyMan instance3 = declaredConstructor2.newInstance();
       System.out.println(instance3);
  }

}

2饿

package cn.design.single;

/**
* @author by lin
* @Classname HungryMan
* @Description 饿
* @Date 2020/4/12 16:48
* @Created in 2020/4/12 16:48 by lin
*/
public class HungryMan {

   private HungryMan() {
  }

//   private byte[] byte=new byte[1024];

   private static final HungryMan hungryMan = new HungryMan();

   public static HungryMan getInstance() {
       return hungryMan;
  }
   // :   
   // byte  

}

3

package cn.design.single;

/**
* @author by lin
* @Classname Holder
* @Description 
* @Date 2020/4/12 16:50
* @Created in 2020/4/12 16:50 by lin
*/
public class Holder {
   private Holder(){}

   public static Holder getInstance(){
       return InnerClass.HOLDER;
  }

   public static class InnerClass{
       private static final Holder HOLDER = new Holder();

  }

}

4

package cn.design.single;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
* @author by lin
* @Classname EnumSingle
* @Description TODO
* @Date 2020/4/12 18:12
* @Created in 2020/4/12 18:12 by lin
*/

// 1.5 
// enum  class 

public enum EnumSingle {
  INSTANCE;

  public EnumSingle getInstance() {
      return INSTANCE;
  }
}
class test{
  public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
      EnumSingle instance1 = EnumSingle.INSTANCE;
      EnumSingle instance2 = EnumSingle.INSTANCE;
      System.out.println("instance1 = " + instance1);
      System.out.println("instance2 = " + instance2);
      // 使 
      Constructor<EnumSingle> declaredConstructor = EnumSingle.class.getDeclaredConstructor(String.class, int.class);
      declaredConstructor.setAccessible(true);
      EnumSingle newInstance = declaredConstructor.newInstance();
      System.out.println(newInstance);

      /* 
        * class,  Enum
        * idea   javap -p xxx.class , , 
        * 使jad ,     String , int 
        *    Cannot reflectively create enum objects
        * declaredConstructor.newInstance();   : , create enum objects
        */
  }
}

5

线线饿使 lazy loading 使

线

  • 使


                

圈~

 注公众号,  转载请备注来源,和链接

原文地址:https://www.cnblogs.com/naimao/p/13353468.html