写在前面

五一放假了,大家是不是因为疫情都减少了出门的频率那?不出门我们就一起在家学习吧!下面就让我们从一个问题出发,开始今天的文章吧。你的类有没有“超生”(到处都是该类的实例)那,它是不是也需要“计划生育”(只需要一个实例)啊?什么你不会?没事让我来告诉你解决类“超生”的办法,使用单例设计模式。下面让我们来一起学习一下单例模式。

概述

什么是单例模式?

单例模式是创建类型中常用的一种设计模式。该模式下的类有且仅有一个实例。

优点

1、可以严格控制单例类的使用者怎样以及何时访问唯一的实例。
2、只有一个实例,可以节约系统资源,提高系统的性能,减轻GC的压力。

凡事有利就要弊,单例模式也不可以滥用。

缺点

1、单例模式的扩展性很差,因为没有抽象层。
2、单例模式在一定程度上违背了“单一职责原则”。

不可以将数据库连接池对象设计为的单例类,如果共享连接池对象的程序过多会出现连接池溢出的问题。不可以使用反射,这样会声明出另一个实例。

创建方式

1、饿汉式
提前创建好类的实例不需要等待创建的时间,直接就可以使用。

/** * 饿汉式(单例模式) */public class HungrySingleton {    // 私有构造方法  private HungrySingleton() {  }    // 创建一个实例  private static final HungrySingleton HUNGRY_SINGLETON_INSTANCE = new HungrySingleton();  /**   * 获取实例的方法   */  public static HungrySingleton getHungrySingleton() {    return HUNGRY_SINGLETON_INSTANCE;  }}

该方式可能在还不需要此实例的时候就已经将创建出来了,没有起到懒加载的效果。

2、使用静态内部类
通过使用静态内部类的方式优化上面的饿汉式,起到懒加载的效果。

/** * 使用静态内部类完成单例模式 */public class HungrySingleton {  // 私有构造方法  private HungrySingleton() {  }  // 利用静态类的加载时机实现懒加载  private static class InnerHungrySingleton{    private static final HungrySingleton HUNGRY_SINGLETON_INSTANCE = new HungrySingleton();  }  /**   * 获取实例的方法   */  public static HungrySingleton getHungrySingleton() {    return InnerHungrySingleton.HUNGRY_SINGLETON_INSTANCE;  }}

3、懒汉式
在第一次使用时创建实例,使用时需要考虑线程安全问题。

/** * 懒汉式(单例模式) */public class LazySingleton {  // 私有构造方法  private LazySingleton() {  }  // 私有静态属性  private static LazySingleton lazySingletonInstance;  /**   * 获取实例的方法   */  public static LazySingleton getLazySingleton() {    // 双重判断    if (null == lazySingletonInstance) {      synchronized (LazySingleton.class) {        if (null == lazySingletonInstance) {          lazySingletonInstance = new LazySingleton();        }      }    }    return lazySingletonInstance;  }}

该方式起到了懒加载的效果,并且也做了线程安全处理。

4、使用枚举
利用枚举的特性让JVM来保证线程安全问题和单一实例的问题。

/** * 使用枚举实现单例 */public enum SingletonEnum {  INSTANCE;  private People people;  SingletonEnum(){    people = new People();  }  public People getPeople() {    return people;  }  // 定义了一个内部类,为了方便代码展示,也可以是一个独立的类。  class People {  }}

使用枚举有一个缺点是需要更多的内存空间。

今天的分享就到这里了,看在我五一放假还坚持分享的份上大家能不能给我点个赞啊?

python单例模式数据库连接池_《java设计模式》一文带你了解单例模式相关推荐

  1. python 数据库连接池_【转】Python 数据库连接池

    python编程中可以使用pymysql进行数据库连接及增删改查操作,但每次连接mysql请求时,都是独立的去请求访问,比较浪费资源,而且访问数量达到一定数量时,对mysql的性能会产生较大的影响.因 ...

  2. Java数据库开发与应用之MySQL数据库、JDBC操作数据库、C3P0数据库连接池,Java反射等

    MySQL数据库,JDBC接口,MyBatis框架等,掌握的数据的存放和管理. Java数据库开发基础,介绍MySQL数据库.JDBC操作数据库.C3P0数据库连接池,Java反射等内容,进行油画商城 ...

  3. python实现数据库连接池_Python实现Mysql数据库连接池

    Python实现Mysql数据库连接池 python连接Mysql数据库: python编程中可以使用MySQLdb进行数据库的连接及诸如查询/插入/更新等操作,但是每次连接mysql数据库请求时,都 ...

  4. java面试 数据库连接池_阿里面试官:数据库连接池有必要吗?你对它的底层实现了解过没?...

    # 前言 数据库连接池的基本思想是:为数据库连接建立一个"缓冲池",预先在池中放入一定数量的数据库连接管道,需要时,从池子中取出管道进行使用,操作完毕后,在将管道放入池子中,从而避 ...

  5. Java设计模式(方法工厂类、单例模式、代理模式、策略模式、适配器、观察者、装饰类等)

    目录 一.简单工厂模式(Factory Method) 二.工厂方法模式 三.抽象工厂模式(Abstract Factory) 3.1 三个工厂模式区别: 四.单例模式(Singleton) 1.饿汉 ...

  6. Java设计模式——为什么要用枚举实现单例模式(避免反射、序列化问题)

    1.序言   相信如果能看到我这篇博客的小伙伴,肯定都看过Joshua Bloch大神说过的这句话:"单元素的枚举类型已经成为实现Singleton的最佳方法".其实,第一次读到这 ...

  7. Java设计模式(4 / 23):单例模式

    文章目录 单例模式的应用场景 饿汉式单例模式 懒汉式单例模式 改进:synchronized 改进:双重检查锁 改进:静态内部类 破坏单例 用反射破坏单例 用序列化破坏单例 解密 注册式单例模式 枚举 ...

  8. mysql 常用数据库连接池_常见的数据库连接池

    欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入 2.C3P0 在Hibernate和Spring中默认支持该数据库连接池 需要引入:c3p0-0.9.1.2.jar包,如果 ...

  9. 阿里巴巴(alibaba)系列_druid 数据库连接池_监控(一篇搞定)记录执行慢的sql语句...

    参考帖子:http://www.cnblogs.com/han-1034683568/p/6730869.html Druid数据连接池简介 Druid是Java语言中最好的数据库连接池.Druid能 ...

  10. Java设计模式及应用场景之《单例模式》

    文章目录 一.单例模式定义 二.单例模式的结构和说明 三.懒汉式和饿汉式的实现 1.懒汉式 2.饿汉式 四.懒汉式和饿汉式的优缺点 五.双重检查加锁方式的实现 六.类级内部类方式的实现 七.枚举方式的 ...

最新文章

  1. 数据结构之直接插入排序
  2. 软件测试2019:第三次作业
  3. 华为正式发布鸿蒙智慧屏,华为正式发布鸿蒙OS操作系统 智慧屏将率先使用
  4. 扩展方法where方法查询不到数据,不会抛异常,也不是返回的null
  5. Nginx Install 记录
  6. 亚马逊aws 服务器删除_AWS推出Apache Airflow全托管工作流MWAA
  7. “ 70后”作家:从尴尬自省到扬眉吐气
  8. Spring Hibernate教程
  9. Hadoop入门进阶步步高(六-Hadoop1.x与Hadoop2的区别
  10. JSF是什么?它与Struts是什么关系?
  11. 第13届 广东工业大学ACM程序设计大赛 C题 平分游戏
  12. Facebook广告账号主页创建时,其实还有这些小知识!
  13. Android ListView下拉刷新点击加载更多
  14. 毕业设计管理系统(JAVA毕业设计)
  15. IP雷达4.0 测试版
  16. 明尼苏达双城计算机科学硕士申请截止日期,明尼苏达大学双城分校
  17. 【手把手带你刷LeetCode】——02.出现1次和K次的数(位运算)
  18. 我!程序媛!上家阿里巴巴,下家字节跳动!薪资翻番!选择裸辞躺平!无限期休息!...
  19. php反向引用,JavaScript 正则应用详解【模式、欲查、反向引用等】
  20. 安装Kali Linux系统 全流程详解

热门文章

  1. 试图运行项目时出错:无法启动调试 没有正确安装调试器
  2. Rational Rose和UML可视化建模基础
  3. mouseover 和 hover 方法
  4. 【linux学习笔记五】帮助命令
  5. 条码控件商IDAutomation极大改善了Barcode Image Generator性能
  6. Entity Framework之问题收集
  7. 刚创建了蕝薱嚣张IT部落
  8. Learning to Ranking
  9. 【学术新闻】强强联合!Papers with Code携手arXiv,上传论文、提交代码一步到位...
  10. 【NLP入门】通俗讲解Subword Models