一万个人眼中有一万个哈姆雷特,一万个程序猿中有一万种对单例模式的理解,以下絮叨絮叨我对单例模式的理解。

引言

民间神抵中,财神是一位掌管财运的神仙,百姓渴望富足的心情在财神信仰中被表现的淋漓尽致。同一朝代只有一位财神,这种情况下百姓们也好信仰,大家烧香,膜拜的时候只要提及财神,每个人都知道指的是哪位神仙。不用在财神前面加上特定的称呼,如文财神比干、武财神赵公明,武财神关公,增幅财神沈万三。这一过程反应到软件设计领域就是一个类只能生成一个对象(财神),所有对象对他的依赖都是相同的(拜财神求富贵),因为只有一对象,大家对它的生平和喜好都非常了解,建立稳固的关系,我们将财神这种神仙职位通过代码方式实现出来。

财神每天都要接受百姓香火、分发财运,百姓每天都要给财神上香,财神只能有一个,也就是一个类只能创建一个对象,大家也都知道对象是通过关键字new完成的(当然也有反射等方式可以实现),但是要怎么控制呢?可以通过构造函数完成,肯定有人会说为什么呢?因为使用new关键字创建对象时都会根据传入的参数调用相应的构造函数,我们将构造函数设置为private私有权限不就可以防止外部创建对象了吗?

Mammon代表财神类,People代表百姓类,下面我们来实现这个逻辑,代码如下。

财神类


public class Mammon {private static final Mammon mammon = new Mammon();// 初始化一个财神private Mammon() {
//      道德的底线束缚着你,目的就是不希望出现第二个财神抢香火}public static Mammon getMammon() {return mammon;}//  财神显灵了public static void apparition() {System.out.println("我就是财神,快来膜拜我吧!");}
}

通过定义一个私有构造器, 避免别的类new出一个对象,而Mammon自己则可以new出一个对象,其他只能通过getMammon获取这个对象。

百姓类


public class People {public static void main(String[] args) {for (int i = 0; i < 5; i++) {Mammon mammon = Mammon.getMammon();mammon.apparition();}
//      看看这五天显灵的是不是同一个财神}
}

运行结果

百姓天天都要给财神上香求富贵,今天膜拜的财神应该和前几天的一样,嗨,还是昨天显灵的财神,仙风道骨、英姿飒飒,这就是我理解的单例模式。

单例模式的定义

单例模式(Singleton Pattern)定义如下:

确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。Singleton类简称单例类,通过使用private的构造函数确保了在一个项目中只产生一个实例对象,并且是自行实例化的(在Singleton中使用自己的new Singleton())。

##单例模式的几种实现方式

饿汉式


public class Singleton {private static final Singleton singleton = new Singleton();
//  限制产生多个实例private Singleton() {}
//  通过该方法获取实例public static Singleton getSingleton() {return singleton;}
//  类中的其他方法,尽量是staticpublic static void demo() {System.out.println("hello world! my name is Singleton");}

优点:没有加锁,执行效率会提高。

缺点:类加载时就初始化,浪费内存。

懒汉式

public class Singleton {  private static Singleton singleton ;  // 限制产生多个实例private Singleton (){}  // 通过该方法获取实例public static synchronized Singleton getInstance() {  if (singleton == null) {  singleton = new Singleton();  }  return singleton;  }
}

优点:第一次调用才初始化,避免内存浪费。

缺点:必须加锁 synchronized 才能保证单例,但加锁会影响效率。

双检锁/双重校验锁(DCL,即 double-checked locking)


public class Singleton {  private volatile static Singleton singleton;  private Singleton (){}  public static Singleton getSingleton() {  if (singleton == null) {  synchronized (Singleton.class) {  if (singleton == null) {  singleton = new Singleton();  }  }  }  return singleton;  }
}

这种方式采用双锁机制,安全且在多线程情况下能保持高性能。

getSingleton() 的性能对应用程序很关键。

单例的应用场景

Spring 在Spring中,每个Bean的默认就是单例的,这样做的优点是Spring容器可以管理这些Bean的声明周期,决定什么时候创建出来,什么时候销毁,销毁时要如何处理等等。

代码地址

https://github.com/dxf1998/MyDesignPattern

文章转自公众号左羊公社

https://mp.weixin.qq.com/s/skI3BSBMaHcRWfHijF0QOg

设计模式-陈词滥调的单例相关推荐

  1. 设计模式C#描述——单例与多例模式

    设计模式C#描述--单例与多例模式 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式有以下特点: 单例类只能有一个实例. 单例 ...

  2. 设计模式学习笔记——单例(Singleton)模式

    设计模式学习笔记--单例(Singleton)模式 @(设计模式)[设计模式, 单例模式, Singleton, 懒汉式, 饿汉式] 设计模式学习笔记单例Singleton模式 基本介绍 单例案例 类 ...

  3. 单例设计模式-Enum枚举单例、原理源码解析以及反编译实战

    package com.learn.design.pattern.creational.singleton;/*** 这个类是Enum类型* 这个枚举非常简单* 枚举类是Object* 他在多线程的时 ...

  4. java中单例设计模式登记式单例类_java23种设计模式-创建型模式之单例模式

    单例模式(Singleton) 单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处: 1.某些类创建比较频 ...

  5. 多个if用什么设计模式_抽丝剥茧——单例设计模式

    单例设计模式 兄弟们好,今天是最后一个设计模式了,也是我们最熟悉的单例设计模式,可以说这个设计模式是我们最先接触到的设计模式了.想当年学习JavaSE的时候,老师聊到一个「饿汉式和懒汉式」,我还纠结了 ...

  6. iOS中常见的设计模式(MVC/单例/委托/观察者)

    关于设计模式这个问题,在网上也找过一些资料,下面是我自己总结的,分享给大家 如果你刚接触设计模式,我们有好消息告诉你!首先,多亏了Cocoa的构建方式,你已经使用了许多的设计模式以及被鼓励的最佳实践. ...

  7. 设计模式之简单单例设计模式

    参考资料:[作者:刘伟  http://blog.csdn.net/lovelion] 单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例 ...

  8. python 与设计模式 ——工厂与单例

    python 与设计模式 源码地址:http://git.oschina.net/duoduo3_69/python_design_pattern git checkout v001(这个版本与此篇博 ...

  9. JS 设计模式 四(单例)

    单例 单例是一个全局变量,使用单例可以更好的控制全局变量,还可以利用分支技术来封装浏览器之间的差异.网页中使用全局变量由于可以被重写风险很大.所以使用单例会更好的控制全局变量. 懒加载 单例模式多数都 ...

最新文章

  1. c语言将一个已知头结点的单链表逆序_C语言数据结构实现链表逆序并输出
  2. Python argparse
  3. mysql hicharts_PHP怎么调用Mysql的数据给Highcharts
  4. word 转 html cms,Java 将Word文件转换为HTML格式文件
  5. Java获取函数参数名称
  6. RocketMQ 消息队列单机部署及使用
  7. vs2005c#能build通过,但是run不了
  8. 技术与管理看看华为怎么说
  9. 坯子库无法一键安装插件没用_坯子插件库的下载地址、安装以及运用办法
  10. 推荐一款点阵字库生成工具/点阵生成器
  11. 如何在edge浏览器上安装flash插件运行需要flash的游戏
  12. linux parallel指令参数,GNU Parallel的具体使用
  13. Crystal Xcelsius 2008 使用Excel XML映射链接
  14. python一维数组转置_Python 矩阵转置的几种方法小结
  15. 07组第二次作业 深度学习和pytorch基础
  16. 远程桌面优化避坑指南
  17. vivado仿真设计流程
  18. win、linux、unix查看系统主机名
  19. 产品负责人(Product Owner)的主要职责和技能
  20. 【云原生之企业级容器技术 Docker实战一】Docker 介绍

热门文章

  1. 独孤思维:最近迷茫了
  2. 讲师专访丨蚂蚁金服庆涛:国产数据库OceanBase和分布式数据核心技术
  3. 阿里云Prometheus监控服务
  4. Java实习生入职第一天
  5. 约瑟夫环问题(圆桌问题)
  6. :runtime error: member access within null pointer of type ‘struct ListNode‘报错
  7. 皮具封边发黑_皮革封边怎么能有黑线!?
  8. 爱立信推出一款特别的AAU产品
  9. SQL SERVER YEAR函数
  10. safari地址栏无法使用百度搜索