总第56篇

在上篇中,我们对整个系统的设计应遵循的六大设计原则进行了系统性的梳理和讲解。在开发过程中,我们应尽量按照这些设计原则去做,当然也不能生搬硬套,要适当权衡,根据自己的项目情况、项目场景去考量。从本篇开始,将通俗易懂地介绍23种设计模式。

本篇将详细梳理单例模式。

1.单例模式的概念

单例模式(Singleton Pattern)是一个比较简单的设计模式,它确保某一个类只有一个实例,并且自行实例化后向整个系统提供一个访问它的全局方法

单例模式的一般通用代码如下:

public class Singleton {private static final Singleton singleton = new Singleton();private Singleton(){}   //私有化构造函数//获取实例对象public static Singleton getInstance(){return singleton;}//其他方法,尽量是static类型的public static void doSomething(){}
}

JavaC++中,单例模式的另一种通用的写法如下:

public class Singleton {private static Singleton instance = null;private String name;private Singleton(String name) {this.name = name;}public static Singleton getInstance(String name) {if (instance == null) {instance = new Singleton(name);}return instance;}
} 

但是,这种通用写法要考虑到线程同步问题。上面的代码在系统高并发时,系统内还是可能存在多个实例,破坏了最初的预期,比如,线程1执行到singleton = new Singleton()而还没有获得对象时(对象初始化需要时间),线程2刚好执行到singleton == null,此时内存中就会出现两个对象。因此,如果不想考虑线程同步问题,可以简单地使用一般通用模式。

2.单例模式的优缺点及使用场景

单例模式的优点可以归结为以下几个方面:

  • 可以大大减少内存开销。特别是对象需要频繁创建、销毁并且无法有效优化时,这种优势更加明显;
  • 可避免对资源的多重占用。比如一个写文件动作,因为只有一个实例存在内存中,可有效避免对同一个资源文件同时写操作;
  • 可方便设置系统全局访问点。这种方式可以大大优化共享资源的访问;

单例模式的缺点可以归结为以下几个方面:

  • 单例模式一般没有接口,扩展比较困难。要扩展只能修改原有的代码;
  • 单例模式不利于测试。在并行开发环境中,若单例模式没有完成,是不能进行测试的;
  • 单例模式与单一职责原则有冲突。单例模式将“要不要单例”与业务逻辑融合在一个类中;

在一个系统中,若要求一个类有且仅有一个对象,则可以采用单例模式。具体的使用场景如下:

  • 要求生成唯一序列号的环境;
  • 在整个项目中需要一个共享访问点或共享数据时;
  • 创建或销毁一个对象消耗的资源过多时;
  • 需要定义大量的静态常量和静态方法时;

3.单例模式的扩展形式

若一个类可以产生多个对象,对象的数量不受限制,这是非常容易实现的,直接new出多个对象就可以了。而有时,对于某个类,我们需要两三个或固定个数的对象实例,这时实现起来就略微有些复杂了。

这种产生固定数量对象的模式称作有上限的多例模式,它是单例模式的一种扩展。对于这种模式,我们在设计时,在类中定义一个private变量,存储实例的个数,并且在构造函数中将这些实例全部创建出来,方便系统后面使用。

单例模式是23个设计模式中比较简单的模式,应用也非常广泛,下图示例了单例模式的概括图。

本文到此结束!下篇继续!

如果对你有帮助,请随手 点赞赞赏!关注本专栏,更多干货与你分享。

=======================================================

欢迎【关注、私信 @武三郎。我们一起交流一起进步。

单例模式应用场景_【简易设计模式04】单例模式相关推荐

  1. java 23种设计模式 04 单例模式

    java 23种设计模式 04 单例模式 一.什么是单例模式 单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象.也就是说,在整个程序空间中,该类只存在一个实例对象.   ...

  2. socket可以写成单例嘛_精读设计模式 Singleton 单例模式

    Singleton(单例模式) Singleton(单例模式)属于创建型模式,提供一种对象获取方式,保证在一定范围内是唯一的. 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 其实单例模 ...

  3. 以下哪个选项不是单例模式的优点_深度解密Python单例模式

    相关代码已经上传至Github:Python_Development_Interview,大家可以收藏专题-Python的设计模式:解密+实战,之后会持续更新相关的设计模式. 1. 认识单例模式 认识 ...

  4. java单例模式 三种_三种java单例模式概述

    在java语言的应用程序中,一个类Class只有一个实例存在,这是由java单例模式实现的.Java单例模式是一种常用的软件设计模式,java单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种.下 ...

  5. 单例模式应用场景_面试:请你谈谈单例模式的优缺点,注意事项,使用场景

    单例模式介绍: 单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个全局对象,这样有利于我们协 ...

  6. 单例模式应用场景_三、单例模式详解

    4.单例模式详解 4.1.课程目标 1.掌握单例模式的应用场景. 2.掌握IDEA环境下的多线程调试方式. 3.掌握保证线程安全的单例模式策略. 4.掌握反射暴力攻击单例解决方案及原理分析. 5.序列 ...

  7. netflix 模式创新_创新设计模式:单例模式

    netflix 模式创新 单例设计模式是一种软件设计模式,用于将类的实例化限制为一个对象. 与其他创建设计模式(例如抽象工厂 , 工厂和构建器模式)相比,单例将创建一个对象,但也将负责,因此该对象只有 ...

  8. 单例模式php应用场景,基于php设计模式中单例模式的应用分析

    单例模式:简单的说,一个对象只负责一个特定的任务. 单例类:    1.构造函数需要标记为private,单例类不能再其他类中实例化,只能被其自身实例化 2.拥有一个保存类的实例静态成员变量 3.拥有 ...

  9. android 单例模式详解,android开发设计模式之——单例模式详解

    单例模式是设计模式中最常见也最简单的一种设计模式,保证了在程序中只有一个实例存在并且能全局的访问到.比如在Android实际APP 开发中用到的 账号信息对象管理, 数据库对象(SQLiteOpenH ...

最新文章

  1. winform 以不规则图形背景显示窗体
  2. Ubuntu Core 给物联网提供更多安全支持
  3. php如何禁用浏览器的缓存,php如何禁止浏览器使用缓存页面
  4. android serviceconnection unbind流程,Android unbindService 流程分析
  5. Linux系统下启动MySQL的命令及相关知识
  6. Python爬虫的经典多线程方式,生产者与消费者模型
  7. loj#2542. 「PKUWC2018」随机游走(MinMax容斥 期望dp)
  8. TwentyTwelve透明主题二次美化版
  9. Java基础学习总结(157)——国产开源JDK来了
  10. Web API应用架构在Winform混合框架中的应用(3)--Winfrom界面调用WebAPI的过程分解...
  11. Windows消息机制概述
  12. Box2DWeb_04之碰撞检测
  13. 解决学校断网,突破天翼校园,实现共享wifi以及linux下无天翼校园客户端
  14. 电商后台之【商品管理系统】
  15. Android音视频【七】H265硬编解码视频通话
  16. html5视频自动轮播,HTML5教程 可自动轮播的旋转木马插件
  17. 利用日志备份恢复时,提示 该 LSN 太晚,无法应用到数据库
  18. JAVA打字游戏的实现
  19. html5音频剪辑,访谈类音频剪辑的5个小贴士
  20. Altuim Designer PCB设计

热门文章

  1. 在听伏尔加纤夫曲 超酷
  2. 浏览器模式用户代理字符串(IE)
  3. EasyNetQ介绍
  4. JavaWeb学习总结(十二)——Session
  5. Flex与.NET互操作(二):基于WebService的数据访问(上)
  6. RabbitMQ自学之路(九)——RabbitMQ实现延时队列的两种方式
  7. Goland提示Unresolved reference ***错误解决
  8. JS的window.parent ,window.top,window.self
  9. 宝鸡文理学院c语言试题,宝鸡文理学院试题电子电磁场与电磁波A
  10. Android和ios速度,不拼硬件拼体验 Android和iOS系统的加载速度测验