zoukankan      html  css  js  c++  java
  • Head First 设计模式 —— 单例模式(Singleton)

    单例模式简要定义:单例模式确保一个类只有一个实例,并提供一个全局访问点

    1. 如何保证一个类只有一个实例,且这个实例易于被访问?

    lazy evaluation:在用到的时候才创建对象。

    • 全局变量:
      • 使得一个对象可以被访问,全局访问点;
      • 但不能防止实例化多个对象;
      • 如果将对象赋值给一个全局变量,那么必须在程序一开始就创建好对象。但是,如果这个对象非常耗费资源,而程序在执行的过程中又一直没有用到它;造成浪费;
    • 单件模式(singleton)提供了一个全局的访问点,像全局变量一样方便,又没有全局变量的缺点(单件类可以延迟实例化);

    2. Java 经典实现

    
    public class Singleton {
        public static synchronized Singleton getInstance() {
            if (uniqueInstance == null) {
                uniqueInstance = new Singleton();
            }
            return uniqueInstance;
        }
        private Singleton() {}
        private static Singleton uniqueInstance; 
    }
    • 在多线程环境下,有可能在一个线程进入 if 判断之后,还未创建赋值对象之前,又有新的线程进入 if 判断,这样就无法保证对象的唯一性;
    • 增加 synchronized 关键字到 getInstance 方法,这样使得在每个线程进入该方法之前,要先等候别的线程离开该方法,也就是说,不会有两个线程可以同时进入被 synchronized 修饰的方法;

    3. 一些特殊需求的单例实现

    • 允许多次 new 创建实例,但每次 new 出来的对象都是同一个对象。

      只需将 getInstance()的实现放进构造函数即可:

      public class Singleton {
          public Singleton() {
              if (self) return;
              self = this;
          }
          private static Singleton self;
      }
  • 相关阅读:
    仿当当网鼠标经过图片翻转
    静态随鼠标移动的Tip
    Weblogic免项目名
    weblogic中文乱码问题
    IE6下的{clear:both}出现怪异的空白
    动态随鼠标移动的Tip
    base标签在ie6下的恶心问题
    javascript中for和for in 区别
    jQuery性能优化<<转>>
    Ant项目打包脚本
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9421242.html
Copyright © 2011-2022 走看看