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 }
  • 相关阅读:
    131. Palindrome Partitioning
    130. Surrounded Regions
    129. Sum Root to Leaf Numbers
    128. Longest Consecutive Sequence
    125. Valid Palindrome
    124. Binary Tree Maximum Path Sum
    122. Best Time to Buy and Sell Stock II
    121. Best Time to Buy and Sell Stock
    120. Triangle
    119. Pascal's Triangle II
  • 原文地址:https://www.cnblogs.com/LinQingYang/p/12382248.html
Copyright © 2011-2022 走看看