您的位置:首页 > 其它

设计模式---单例模式

2016-03-05 11:56 190 查看
# 单例模式

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

#代码

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;

       }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式