博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
5.单例设计模式
阅读量:5806 次
发布时间:2019-06-18

本文共 2545 字,大约阅读时间需要 8 分钟。

 为什么需要单例设计模式?

  我们在系统设计的时候,出于对性能,或者安全性等多种因素考虑,有些对象我们只需要一个。可能是全局只需要一个,也可能是整个系统只需要一个。

    这个时候我们就需要用到单例模式了。比如系统的配置文件。工具类,线程池,日志对象等等。。。。

  类比一下。在过去是不是一个国家只能有一个皇帝。这个皇帝的生产就是必须通过一个单例模式对象来生产。

 

  单例设计模式说明:

    单例设计模式分析: 其实单例设计模式有六种,饿汉式,懒汉式,枚举等等  记得面试这家公司的时候,有一道面试题就是:

    写一个你认为最好的单例设计模式实现,当时我写的就是双重认证设计模式。这个是线程安全的设计模式。本篇文章主要介绍两种单例设计模式:

    1.懒汉式    2.饿汉式  设计模式,并且会对这两种设计模式记性对比,其他的充分理解这两种设计模式之后。再后续文章中会进行补充。

 

  单例设计模式特点:

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

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

    

  实现:  

    1.懒汉式

public class Singleton    {
     //因为是懒汉所以刚开始没有创建对象,只有在获取对象的时候才去判断是否有对象,有就直接返回,否者就创建对象然后返回 private static Singleton m_Instance; private Singleton() { // 将默认构造函数定义为私有,防止外部调用它实例化别的对象 } public static Singleton GetInstance() { if (m_Instance == null) { m_Instance = new Singleton(); } return m_Instance; } }

  2.恶汉式

public class Singleton    {
     //因为是恶汉式 所以上来就创建了一个对象,通过静态公共方法获取实例时候,判断是否创建了实例,如果有就直接返回,否者就创建实例,然后返回。 private static Singleton m_Instance = new Singleton(); private Singleton() { // 将默认构造函数定义为私有,防止外部调用它实例化别的对象 } public static Singleton GetInstance() { return m_Instance; } }

  

    说明对类图中对象的关系不熟悉的可以查看我的第二篇文章。或者问让度娘给你好好解释一下。

  总结:

    相同点:

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

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

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

    不同点:

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

      

    懒汉模式和饿汉模式的优缺点:

      懒汉模式,它的特点是运行时获得对象的速度比较慢,但加载类的时候比较快。它在整个应用的生命周期只有一部分时间在占用资源。
      饿汉模式,它的特点是加载类的时候比较慢,但运行时获得对象的速度比较快。它从加载到应用结束会一直占用资源。
      这两种模式对于初始化较快,占用资源少的轻量级对象来说,没有多大的性能差异,选择懒汉式还是饿汉式都没有问题。但是对于初始化慢,占用资源多的重量级对象                      来说,就会有比较明显的差别了。所以,对重量级对象应用饿汉模式,类加载时速度慢,但运行时速度快;懒汉模式则与之相反,类加载时速度快,但运行时第一次获                      得对象的速度慢。
    从用户体验的角度来说,我们应该首选饿汉模式。我们愿意等待某个程序花较长的时间初始化,却不喜欢在程序运行时等待太久,给人一种反应迟钝的感觉,所以对于有重                      量级对象参与的单例模式,我们推荐使用饿汉模式。
    而对于初始化较快的轻量级对象来说,选用哪种方法都可以。如果一个应用中使用了大量单例模式,我们就应该权衡两种方法了。轻量级对象的单例采用懒汉模式,减轻加                     载 时的负担,缩短加载时间,提高加载效率;同时由于是轻量级对象,把这些对象的创建放在使用时进行,实际就是把创建单例对象所消耗的时间分摊到整个应用中去                     了,对于整个应用的运行效率没有太大影响。

    安全性考虑:    

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

    注意事项:

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

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

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

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

    试用场景:

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

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

                     有状态的工具类对象。

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

                     以及其他我没用过的所有要求只有一个对象的场景

 

    大致上就总结这么多了。当然关于单例模式远不止这点东西。在掌握,理解这些东西的基础上。可以在进行拓展学习。

  

转载于:https://www.cnblogs.com/supren/p/7875384.html

你可能感兴趣的文章
sshd_config设置参数笔记
查看>>
LeetCode--112--路径总和
查看>>
感悟贴2016-05-13
查看>>
百度编辑器ueditor 光标位置的坐标
查看>>
DEV-C++ 调试方法简明图文教程(转)
查看>>
参加婚礼
查看>>
Java重写equals方法和hashCode方法
查看>>
Spark API编程动手实战-07-join操作深入实战
查看>>
EasyUI基础入门之Easyloader(载入器)
查看>>
Spring ’14 Wave Update: Installing Dynamics CRM on Tablets for Windows 8.1
查看>>
MySQL 备份与恢复
查看>>
吃午饭前,按书上的代码写会儿--Hunt the Wumpus第一个版本
查看>>
TEST
查看>>
PAT A1037
查看>>
ReactiveSwift源码解析(三) Signal代码的基本实现
查看>>
(六)Oracle学习笔记—— 约束
查看>>
[Oracle]如何在Oracle中设置Event
查看>>
top.location.href和localtion.href有什么不同
查看>>
02-创建hibernate工程
查看>>
Scrum之 Sprint计划会议
查看>>