zoukankan      html  css  js  c++  java
  • 单例设计模式

    概述

             有时候某些对象我们只需要一个,如:线程池、缓存、对话框等等,对于这类对象我们只能有一个实例

            单例模式确保一个类只有一个实例,并且自行实例化并向整个系统提供这个实例

     特点

             1 只能有一个实例    2 类自己创建自己的唯一实例    3 给所有其他对象提供这一实例

    饿汉式

    class EagerSingleton{
        private static final EagerSingleton instance = new EagerSingleton();
        
        private EagerSingleton(){}
        
        public static EagerSingleton getInstance(){
            return instance;
        }
    }
    View Code

    懒汉式

    class EagerSingleton{
        private static EagerSingleton instance = null;
        
        private EagerSingleton(){}
        
        public static synchronized EagerSingleton getInstance(){
            if (instance == null) {
                instance = new EagerSingleton();
            }
            return instance;
        }
    }
    View Code

            饿汉式单例类在自己被加载时就将自己实例化,即便加载器是静态的。单从资源利用效率角度来讲,这个比懒汉式单例类稍差。从速度和反映时间来讲,比饿汉式单例好,

             在Java语言内,Java.lang.Runtime对象就是一个使用单例模式的例子,在每个Java应用程序里,都有一个唯一的Runtime对象。通过这个对象程序可以与运行环境发生相互作用

    四、模式优缺点                                                                                                     

               优点

                  一、节约了系统资源。由于系统中只存在一个实例对象,对与一些需要频繁创建和销毁对象的系统而言,单

    例模式无疑节约了系统资源和提高了系统的性能。

                 二、因为单例类封装了它的唯一实例,所以它可以严格控制客户怎样以及何时访问它。

             缺点

                 一、由于单例模式中没有抽象层,因此单例类的扩展有很大的困难。

                 二、单例类的职责过重,在一定程度上违背了“单一职责原则”。

               五、模式使用场景                                                                                             

               下列几种情况可以使用单例模式。

                  一、系统只需要一个实例对象,如系统要求提供一个唯一的序列号生成器,或者需要考虑资源消耗太大而只允许创建一个对象。

                 二、客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例。

               六、总结                                                                                                           

               1. 单例模式中确保程序中一个类最多只有一个实例。

               2. 单例模式的构造器是私有了,而且它必须要提供实例的全局访问点。

               3. 单例模式可能会因为多线程的问题而带来安全隐患。

  • 相关阅读:
    C#中的异常处理
    How to: Create a Windows Communication Foundation Client
    王立平--result += "{";
    Gradle增量学习建筑
    android 当屏幕截图,你如何改变屏幕内容,他们俩bitmap将合并的图像被一起显示
    惊人go语言(image网站开发)
    树莓派的演奏音符3 -- LCD1602显示文章
    Linux解析内核源代码——传输控制块诞生
    Preemption Context Switches 和 Synchronization Context Switches
    folat i = 0.1; 警告
  • 原文地址:https://www.cnblogs.com/whesuanfa/p/7373377.html
Copyright © 2011-2022 走看看