在前面的博文中,小编介绍了设计模式中的原型模式,不知道有没有帮助到有需要的小伙伴呢`(*∩_∩*)′,今天这篇博文,小编继续来介绍相关的设计模式,今天要和大家见面的是单例模式,不由得又让小编想起Darry Ring,或许只能想想而已`(*∩_∩*)′,开篇闲扯到这里,接着步入正题,今天这篇博文,小编会从什么是单例模式,为什么要使用单例模式,饿汉式,懒汉式、双重检查以及配之以相关的Demo进行讲解,希望对有需要的小伙伴有帮助,还请小伙伴多多指教。

什么是单例模式

单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象,其实GOF对单例模式的定义是:保证一个类, 只有一个实例存在,同时提供能对该实例加以访问的全局访问方法,我们来看一下单例模式的结构图:

为什么要使用单例模式

在应用系统开发中,我们常常有以下需求

a、在多个线程之间,比如servlet环境,共享同一个资源或者操作同一个对象。

b、在整个程序空间使用全局变量,共享资源。

c、大规模系统中,为了性能的考虑,需要节省对象的创建时间等等。

因为单例模式可以保证为一个类只生成唯一的实例对象,所以这些情况,单例模式就派上用场了。

单例模式的实现

a、饿汉式

b、懒汉式

c、双重检查

首先,我们来实现一个简单的,新建一个java项目,新建Person类,生成get和set方法,保证人只有一个实例,计划生育,响应国家号召是不是`(*∩_∩*)′,编写相关代码,如下所示:

public class Person {public String name;public String getName() {return name;}public void setName(String name) {this.name = name;}}

新建类MainClass,我们可以new多少个对象呢?编写相关代码,如下所示:

public class MainClass {public static void main(String[] args){Person per = new Person();Person per2 = new Person();per.setName("xiaoding");per2.setName("dingding");System.out.println(per.getName());System.out.println(per2.getName());}}

运行,如下所示:


通过Person类,getName得到的是两个name,表明这两个根本就不是一个对象,也就是说,通过person类,我们生成了两个不同的对象,如果是一个的话,她们的名字应该是一样的,我们如何保证只有一个对象呢?我们在MainClass里面new的是她的构造函数,改造Person的代码,把构造函数私有化,代码如下所示:

public class Person {public String name;public String getName() {return name;}public void setName(String name) {this.name = name;}//构造函数私有化private Person(){}//提供一个全局的静态方法public static Person getPerson(){return new Person();}}

改造MainClass的方法,如下所示:

public class MainClass {public static void main(String[] args){Person per = Person.getPerson();Person per2 = Person.getPerson();per.setName("xiaoding");per2.setName("dingding");System.out.println(per.getName());System.out.println(per2.getName());}}

运行,如下所示:

运行还是两个对象,我们如何保证是一个对象呢?如何保证实例化一个对象呢?我们可以采用饿汉式,编写Person的代码部分我们直接通过对象就能调用,如下所示:

public class Person {public static final Person person = new Person();public String name;public String getName() {return name;}public void setName(String name) {this.name = name;}//构造函数私有化private Person(){}//提供一个全局的静态方法public static Person getPerson(){Return person;}}

运行,效果如下所示:


这个时候就表示,他们是同一个对象,getPerson的是一个对象,那么什么是懒汉式呢?重新新建一个了Person2,编写相关代码如下所示:

public class Person2 {private String name;private static Person2 person;public String getName() {return name;}public void setName(String name) {this.name = name;}//构造函数私有化private Person2(){}//提供全局的静态方法public static Person2 getPerson(){if(person == null){person = new Person2();}return person;}}

运行效果如下所示:


这个呢就是所谓的饿汉式,懒汉式类加载的时候直接初始化,如果是多线程,懒汉式是不能保证只有一个实例的,那么我们如何解决这个问题呢?新建类Person3,编写相关代码:

public class Person3 {private String name;private static Person3 person;public String getName() {return name;}public void setName(String name) {this.name = name;}//构造函数私有化private Person3(){}//提供全局的静态方法public static Person3 getPerson(){if(person == null){person = new Person3();}return person;}}

Person3相对于Person2来说,解决了多线程的问题,接着我们来看双重检查,双重检查,我们来看新建类Person4,编写相关代码,如下所示:

public class Person4 {private String name;private static Person4 person;public String getName() {return name;}public void setName(String name) {this.name = name;}//构造函数私有化private Person4(){}//提供全局的静态方法public static Person4 getPerson(){if(person == null){synchronized(Person4.class){if(person == null){person = new Person4();}}}return person;}}

小编寄语:该博文,小编主要简单的介绍了单利模式,分别介绍了什么是单例模式、单例模式的结构图、饿汉式、懒汉式、双重检查等方面做了简单的介绍,对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。如在Windows中就只能打开一个任务管理器。如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态。因此有时确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。如何保证一个类只有一个实例并且这个实例易于被访问呢?定义一个全局变量可以确保对象随时都可以被访问,但不能防止我们实例化多个对象。一个更好的解决办法是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法。这就是单例模式的模式动机。

【设计模式系列】--单例模式相关推荐

  1. 极速理解设计模式系列【目录索引】

    这是一个老生常谈的设计模式系列文章,本系列力图从最简洁的语言和最易理解的实例来让大家认识设计模式的思想和思路,从而在实际项目中能够用到一二.现在将本系列文章详列如下: 极速理解设计模式系列:1.建造者 ...

  2. JavaScript设计模式系列四之外观模式(附案例源码)

    文章初衷 设计模式其实旨在解决语言本身存在的缺陷, 目前javaScript一些新的语法特性已经集成了一些设计模式的实现, 大家在写代码的时候,没必要为了用设计模式而去用设计模式, 那么我这边为什么还 ...

  3. javascript设计模式系列 - LukeLin - 博客园

    javascript设计模式系列 创建型: 1.抽象工厂模式(Abstract Factory) 2.构建者模式(Builder) 3.工厂方法模式(Factory Method) 4.原型模式(Pr ...

  4. php 设计模式系列,一看就懂系列之 php设计模式(一)-Go语言中文社区

    前言 一提到设计模式,很多人都是敬而远之,一方面由于设计模式有一点忽悠太理论的感觉,另一方面也会觉得设计模式有点难懂不知道该在什么场景下使用.一看就懂系列之php设计模式,主要解决两个问题: 1.用最 ...

  5. JavaScript设计模式系列—模式篇总结(上)

    转载请注明预见才能遇见的博客:http://my.csdn.net/ 原文地址:https://blog.csdn.net/pcaxb/article/details/102517956 JavaSc ...

  6. PHP - 设计模式系列

    1.应用场景 主要用于学习掌握编程中的设计模式,开发高质量, 易扩展,维护的程序. 学习掌握编程最佳实践.有时候也是为了应对面试,但不应该是作为有追求的编程者的主要目的. 2.学习/操作 1.文档阅读 ...

  7. 【设计模式系列24】GoF23种设计模式总结及软件设计7大原则

    设计模式总结及软件设计七大原则 设计模式系列总览 前言 软件设计7大原则 开闭原则(Open-Closed Principle,OCP) 里氏替换原则(Liskov Substitution Prin ...

  8. PHP设计模式系列:目录

    为了方便查找和学习,现将PHP设计模式系列文章列出目录. PHP设计模式系列:简单工厂模式 PHP设计模式系列(一):策略模式 PHP设计模式系列(二):装饰模式 PHP设计模式系列(三):代理模式 ...

  9. 【设计模式系列19】状态模式原理分析及其和策略模式,责任链模式的区别

    状态模式原理分析 设计模式系列总览 前言 什么是状态模式 状态模式示例 状态模式角色 状态模式与责任链模式 状态模式与策略模式 状态模式应用场景 状态模式优缺点 总结 设计模式系列总览 设计模式 飞机 ...

  10. 浅谈设计模式之单例模式、适配器模式、抽象工厂模式

    带你读懂几种常见的设计模式 第三弹 本文已经是设计模式系列的第三篇文章了,今天来讲讲单例模式.抽象工厂模式和适配器模式. 1.单例模式 单例模式让一个类最多只有一个实例.具体的做法是: 让类的构造方法 ...

最新文章

  1. 开源android豆瓣电影阅读器
  2. 深度剖析 synchronized
  3. C++学习之路 | PTA乙级—— 1062 最简分数 (20 分)(精简)
  4. php serialize error at offset,unserialize(): Error at offset出现的原因分析以及解决方法
  5. 如何更好地利用JavaScript数组
  6. 纯Java代码 图片压缩
  7. Exchange Server 2016管理系列课件03.管理邮箱配额限制
  8. Unity3D基础8:C#脚本
  9. 【转载】Android S5PV210 fimc驱动分析 - fimc_regs.c
  10. 《软件体系结构》 练习题
  11. winrar加密分析
  12. VSE++: Improving Visual-Semantic Embeddings with Hard Negatives------BMVC 2018
  13. raise notice oracle,openGauss 循序渐进:通过 raise notice 模拟 Oracle 的 DBMS_OUTPUT
  14. 2021个人年度总结-追寻
  15. json模块错误:Expecting value: line 1 column 1 (char 0)
  16. python+selenium+request实行全自动12306抢票和购票
  17. 之和质数c语言题判断,C语言经典例题100例——C语言练习实例33解答(质数判断)...
  18. 笔记:戴蒙德模型——参数变化的影响
  19. idea常用的一些配置信息
  20. 常见字母组合发音规律

热门文章

  1. 小小丁出生——有图有真相
  2. Python-pygsheets模块(读写Google谷歌文档)
  3. php deel views,视图 - Views
  4. Android第三方框架之学习高德地图SDK-----①集成环境,获取定位信息,地图显示。
  5. 黑鲨怎么修改服务器,黑鲨自定义安装系统教程图解
  6. C语言常见文件操作函数总结详解
  7. 常用时序数据地址 MTGNN
  8. 中标麒麟桌面系统自定义屏保
  9. 推荐8款免费企业邮箱,让你的工作便捷起来
  10. 阿里总参谋长曾鸣:区块链中没有绝对的“去中心化”