zoukankan      html  css  js  c++  java
  • 单例模式(Singleton)

    2020/02/29

    单例模式(Singleton):用来创建独一无二的,只能有一个实例的对象的入场券。

    单例模式是所有模式的例图中最简单的!

    使用单例模式的场景

      线程池(threadpol)、缓存(cache)、对话框、处理偏好设置和注册表(registry)对象、日志对象、充当打印机、显卡等设备的驱动程序的对象。


     

    如果制造出多个实例,就会导致许多问题的产生,如

      程序的行为异常、资源使用过量,或者是不一致的结果。


     

    单例模式的优点

      单例模式是经得起时间考验的方法,可以确保只有一个实例会被创建;

      单例模式也给了我们一个全局的访问点,和全局变量一样方便,又没有全局变量的缺点。


     

    全局变量的缺点

       如果将对象赋值给一个全局变量,那么你必须在程序一开始就创建好对象★。万一这个对象非常耗费资源,而程序在这次的执行过程中又一直没有用到它,就形成了浪费。

      代理模式可以在需要时才创建对象。

    ★这其实和实现有关。有些JVM的实现是在用到的时候才创建对象。


     

    剖析经典的单例模式实现:

    public class Singleton {
        private static Singleton uniqueInstance; //利用一个静态变量来记录Singleton类的唯一实例。
        //这里是其他的有用实例化变量
        private Singleton() {} //把构造器声明为私有的,只有在Singleton类内才可以调用构造器。
        public static Singleton getInstance() { //用getInstance()方法实例化对象,并返回这个实例。
            if (uniqueInstance == null) {
                uniqueInstance = new Singleton();    
            }
            return uniqueInstance;
        }
        //这里是其他方法。
        //当然Singleton是一个正常的类,具有一些其他用途的实例变量和方法。
    }

    Singleton

    static uniqueInstance

    //  其他有用的单例数据......      

    static getInstanec()

    //其他有用的单例方法......

     

    这个类变量持有唯一的单例实例。 

     

     

     

    getInstance()方法是静态的,这意味着它是一个类方法,所以可以在代码的任何地方使用Singleton.getInstance()访问它。

     这和访问全局变量一样简单,只是多了一个优点,单例可以延迟实例化。


    但上面的代码可能会在多线程的情况下产生多个实例!

    处理多线程

    只要把 getInstance() 变成同步(synchronized)方法,多线程灾难几乎就可以轻易的解决了:

     1 public class Singeton {
     2     private static Singleton uniqueInstance;
     3     
     4     //其他有用的实例化的变量
     5     private Singleton() {}
     6     public static synchronized Singleton getInstance() {
     7         if (uniqueInstance == null) {
     8             uniqueInstance = new Singleton();
     9         }
    10         return uniqueInstance;
    11     }
    12     //其他有用的方法
    13 }
  • 相关阅读:
    sharepoint server 2010 打开网页非常慢
    sharepoint 2010 彻底删除用户
    Exchange2007设置网页OWA访问
    sharepoint 2007 网页内嵌打开pdf
    BAT+VBS、BAT+REG、BAT+HTML 混合编程
    Exchange2007安装后如何添加域账户邮箱
    Outlook2003无法登陆Exchange2007邮箱,提示outlook版本禁止
    Winsock Fix for Windows 7
    Silverlight 3 脱机安装
    WCF问题及解决方案
  • 原文地址:https://www.cnblogs.com/LinQingYang/p/12382248.html
Copyright © 2011-2022 走看看