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

    ref: 5.单例设计模式

    场景需求

      我们在系统设计的时候,出于对性能或安全性等多种因素考虑,有些对象我们只需要一个。可能是全局只需要一个,也可能是整个系统只需要一个,比如系统的配置文件。工具类,线程池,日志对象等等。这个时候就需要用到单例模式了。

    设计特点

      单例类确保自己只有一个实例。

      单例类必须自己创建自己的实例。

      单例类必须为其他对象提供唯一的实例。

    代码实现

     1 // 懒汉式
     2 public class Singleton
     3 {
     4     //因为是懒汉所以刚开始没有创建对象,只有在获取对象的时候才去判断是否有对象,有就直接返回,否者就创建对象然后返回
     5     private static Singleton m_Instance;
     6     private Singleton()
     7     {
     8         // 将默认构造函数定义为私有,防止外部调用它实例化别的对象
     9     }
    10  
    11     public static Singleton GetInstance()
    12     {
    13         if (m_Instance == null)
    14         {
    15             m_Instance = new Singleton();
    16         }
    17         return m_Instance;
    18     }
    19 }
    20 
    21 // 饿汉式
    22 public class Singleton
    23 {
    24     //因为是饿汉式 所以上来就创建了一个对象,通过静态公共方法获取实例时候,判断是否创建了实例,如果有就直接返回,否者就创建实例,然后返回。
    25     private static Singleton m_Instance = new Singleton();
    26     private Singleton()
    27     {
    28         // 将默认构造函数定义为私有,防止外部调用它实例化别的对象
    29     }
    30  
    31     public static Singleton GetInstance()
    32     {
    33         return m_Instance;
    34     }
    35 }

    相同点

      1. 都有一个静态私有本类成员变量

      2. 都有一个私有构造函数

      3. 都有一个静态公有返回成员变量方法。

    不同点

      1. 饿汉式比较饿,在定义静态私有本类成员变量的时候就创建了对象;而懒汉式比较懒,在返回对象的时候进行判断,如果成员变量没有指向才创建。

    优缺点

      1. 懒汉模式,它的特点是运行时获得对象的速度比较慢,但加载类的时候比较快。它在整个应用的生命周期只有一部分时间在占用资源。

      2. 饿汉模式,它的特点是加载类的时候比较慢,但运行时获得对象的速度比较快。它从加载到应用结束会一直占用资源。

      3. 这两种模式对于初始化较快,占用资源少的轻量级对象来说,没有多大的性能差异,选择懒汉式还是饿汉式都没有问题。但是对于初始化慢,占用资源多的重量级对象来说,就会有比较明显的差别了。所以,对重量级对象应用饿汉模式,类加载时速度慢,但运行时速度快;懒汉模式则与之相反,类加载时速度快,但运行时第一次获得对象的速度慢。

      4. 从用户体验的角度来说,我们应该首选饿汉模式。我们愿意等待某个程序花较长的时间初始化,却不喜欢在程序运行时等待太久,给人一种反应迟钝的感觉,所以对于有重量级对象参与的单例模式,我们推荐使用饿汉模式。

      5. 而对于初始化较快的轻量级对象来说,选用哪种方法都可以。如果一个应用中使用了大量单例模式,我们就应该权衡两种方法了。轻量级对象的单例采用懒汉模式,减轻加    载 时的负担,缩短加载时间,提高加载效率;同时由于是轻量级对象,把这些对象的创建放在使用时进行,实际就是把创建单例对象所消耗的时间分摊到整个应用中去了,对于整个应用的运行效率没有太大影响。

    安全性

      1. 主要是网上的一些说法,懒汉式的单例模式是线程不安全的,即使是在实例化对象的方法上加synchronized关键字,也依然是危险的、懒汉式是线程安全的。

    注意事项

      1. 只能使用单例类提供的方法得到单例对象,不要使用反射,否则将会实例化一个新对象。

      2. 不要做断开单例类对象与类中静态引用的危险操作。

      3. 多线程使用单例使用共享资源时,注意线程安全问题。

      4. 单例设计模式的构造方法是私有的,不要尝试去继承他们。

    使用场景

      1. 需要频繁实例化然后销毁的对象。

      2. 创建对象时耗时过多或者耗资源过多,但又经常用到的对象。

      3. 有状态的工具类对象。

      4. 频繁访问数据库或文件的对象。

      5. 其他只需要一个对象的使用场景……

      

  • 相关阅读:
    【算法系列学习】Dijkstra求最短路 [kuangbin带你飞]专题四 最短路练习 D
    【算法系列学习】Dijkstra算法变形 [kuangbin带你飞]专题四 最短路练习
    【算法系列学习】Dijkstra单源最短路 [kuangbin带你飞]专题四 最短路练习 A
    【算法系列学习】[kuangbin带你飞]专题十二 基础DP1 G
    【算法系列学习】[kuangbin带你飞]专题十二 基础DP1 F
    【算法系列学习】[kuangbin带你飞]专题十二 基础DP1 E
    【算法系列学习】状压dp [kuangbin带你飞]专题十二 基础DP1 D
    【算法系列学习】[kuangbin带你飞]专题十二 基础DP1 C
    【算法系列学习】[kuangbin带你飞]专题十二 基础DP1 B
    【算法系列学习】DP和滚动数组 [kuangbin带你飞]专题十二 基础DP1 A
  • 原文地址:https://www.cnblogs.com/huhunet/p/7908392.html
Copyright © 2011-2022 走看看