设计模式---单例模式

来源:互联网 发布:生物竞赛题库软件 编辑:程序博客网 时间:2024/06/05 10:06

# 单例模式

#单例模式-->从始至终 只产生一个示例

#代码

public class Single {
  private  static Single instance;
  private  Single(){
  }
  public Single getInstance(){
      if(instance!=null){
          instance = new Single();
      }
      return instance;
  }
}

# Static 修饰变量表示是静态变量

被 static修饰 表示是静态变量  没有表示是实例变量  二者的区别 在于  静态变量 在 加载类的时候就会分配内存   可以用类名直接访问  实例变量 会在类实例化的时候  进行内存分配 会在内存中有多个备份  互不影响  静态变量 只会在内存中有一个

实例变量 只有在用的时候 才会实例化  但是静态变量 只要加载类  就会实例化 但是只会有一个


要点  1 。 静态全局变量 instance

       2. 构造方法 私有化  private  这样 非子类都不能访问 

   3. public 的getInstance方法 来实例化对象

# 如果多个线程  同时访问  有可能实例化多个对象出来 

比如  线程一 运行到 if判断的时候  sleep一秒钟  线程二 运行过来if  这是  实例已经被创建了  但是  线程一 仍然 任务 instance 是null  于是又创建了新 的一个

#解决办法 使用 synchronize 同步代码块  当 线程一 运行该部分代码时  线程二 会等待他 运行结束 在运行 该部分代码

**************************完美解决方式*********************************

*/
/**
 * 使用静态内部类来实现     静态内部类只能访问外部类的静态成员 静态内部类不能new
 * @author arthas
 *
 */
public class Single {
//1 一个私有的构造方法 保证  获取该实例的时候 不会通过此方法
    private  Single() {
    }
// 2 一个公共的静态内部类 里面只有一个静态的最终类 实例对象 instance
       public static class Singleton1{
            private static final Single instance = new Single();
    }   
    //一个公共的构造方法 得到instance实例 静态变量可以通过 类名点点的方式直接获取
       public static Single getInstance(){
           return Singleton1.instance;
       }
}




0 0
原创粉丝点击