设计模式(1)-单例模式

比特踏月使
• 阅读 607

摘要

  • 简单介绍了什么是单例模式
  • 介绍了懒汉式和饿汉式的实现
  • 分析了单例模式出现的场景
  • 用数据库连接池的例子演示了单例模式

概念

确保一个类只能有一个实例,并提供一个全局访问点来访问这个实例。

要点

  • 某一个类只能创建一个一个实例
  • 必须类内部自行创建这个实例
  • 必须向系统提供这个实例,也就是提供一个全局访问点

优点

  • 保证内存中只有一个实例,减小内存开销
  • 避免对资源的多重占用
  • 设置全局访问点,优化和共享资源的访问

缺点

  • 扩展困难,如果要扩展除了修改原来的代码没有第二种开发途径,违背开闭原则
  • 单例模式的功能通常都写在一个类中,如果功能设计不合理,则很容易违反单一职责原则
  • 并发测试中不好debug

场景

对于Java来说,单例模式的落地就是在JVM中只存在单一实例。

  • 需要频繁创建一些类,使用单例可以降低系统的内存压力,减少GC
  • 某类只要求生成一个对象的时候,比如一个班中的班长,一个人的身份证
  • 某些类创建实例时占用资源较多,或实例化耗时较长,且经常使用。
  • 某类需要频繁实例化,而创建的对象又频繁被销毁的时候,如多线程的线程池、网络连接池等。
  • 频繁访问数据库或文件的对象。
  • 对于一些控制硬件级别的操作,或者从系统上来讲应当是单一控制逻辑的操作,如果有多个实例,则系统会完全乱套。
  • 当对象需要被共享的场合。由于单例模式只允许创建一个对象,共享该对象可以节省内存,并加快对象访问速度。如 Web 中的配置对象、数据库的连接池等。

实现方式

懒汉式

每次访问都需要同步,会影响性能,且消耗更多的资源,这就是懒汉式的缺点

public class Lazy{
    private static volatile Lazy instance;
    private Lazy(){}
    //DLC
    public static getInstance(){
        if(instance==null){
            synchronized(Lazy.class){
                if(instance==null){
                    instance = new Lazy();
                }
            }
        }
        return instance;
    }
}

饿汉式

public class Hungry{
    private static final Hungry instance = new Hungry();
    private Hungry() {}
    public static Hungry getInstance() {
        return instance;
    }
}

实例

获取数据库连接池

public final class DbConnectConfig {
 
    private static ComboPooledDataSource dataSource;
 
    static {
        dataSource = new ComboPooledDataSource();
        dataSource.setUser(JdbcPropertiesConfig.getUSERNAME());
        dataSource.setPassword(JdbcPropertiesConfig.getPASSWORD());
        dataSource.setJdbcUrl(JdbcPropertiesConfig.getDATABASEURL());
        dataSource.setDriverClass(xxxxxxx);
        //初始化连接数
        dataSource.setInitialPoolSize(xxx.getINITIALPOOLSIZE());
        //最小连接数
        dataSource.setMinPoolSize(xxx.getMINPOOLSIZE());
        //最大连接数
        dataSource.setMaxPoolSize(xxx.getMAXPOOLSIZE());
        //最长等待时间
        dataSource.setMaxStatements(xxx.getMAXSTATEMENTS());
        //最大空闲时间,单位毫秒
        dataSource.setMaxIdleTime(xxx.getMAXIDLETIME());
        dataSource.setCheckoutTimeout(5000);
        dataSource.setUnreturnedConnectionTimeout(20);
    }
 
     //这里使用DLC好一点
    public synchronized static final Connection getConnection() {
        Connection conn = null;
        try {
            conn = dataSource.getConnection();
        } catch (SQLException e) {
            System.out.println("\r\n数据库连接异常");
            e.printStackTrace();
        }
        return conn;
    }
}

参考

[1].单例模式设置mysql数据库连接池

[2].单例模式(单例设计模式)详解

[3].学习笔记 : Java设计模式之Singleton Pattern

本文作者: Both Savage

本文链接: https://bothsavage.github.io/...

版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

点赞
收藏
评论区
推荐文章
3A网络 3A网络
2年前
Golang 常见设计模式之单例模式
之前我们已经看过了Golang常见设计模式中的装饰和选项模式,今天要看的是Golang设计模式里最简单的单例模式。单例模式的作用是确保无论对象被实例化多少次,全局都只有一个实例存在。根据这一特性,我们可以将其应用到全局唯一性配置、数据库连接对象、文件访问对象等。Go语言实现单例模式的方法有很多种,下面我们就一起来看一下。饿汉式饿汉式实现单例模式非
Wesley13 Wesley13
3年前
java设计模式1
1:单例模式简介  单例模式是一种常用的软件设计模式,它确保某个类只有一个实例,而且自行实例化并向整个系统提供唯一的实例。总而言之就是在系统中只会存在一个对象,其中的数据是共享的  特点:    单例类只能有一个实例,所以一般会用static进行修释。    单例类必须自己创建自己的唯一实例。也就是在类中要new一个自己。    单例类必
Wesley13 Wesley13
3年前
java 23种设计模式(五、单例模式)
作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。单例模式的结构  单例模式的特点:单例类只能有一个实例。单例类必须自己创建自己的唯一实例。单例类必须给所有其他对象提供这一实例。  饿汉式单例类publicclassEagerSingleton
红烧土豆泥 红烧土豆泥
4年前
创建型模式之单例设计模式
什么是单例设计模式?顾名思义,只有一个实例。单例模式它主要是确保一个类只有一个实例,并且可以提供一个全局的访问点。废话少说,直接上干货了单例模式之饿汉式所谓饿汉式,顾名思义,“它很饿”。所以说,它一旦被加载进来,就会直接实例化一个对象。例如:languageclassSingleton{privatestaticfin
Wesley13 Wesley13
3年前
JAVA设计模式之单例设计模式
    单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。  在JAVA中实现单例,必须了解JAVA内存机制,JAVA中实例对象存在于堆内存中,若要实现单例,必须满足两个条件:  1.限制类实例化对象。即只能产生一个对象。
Wesley13 Wesley13
3年前
Java单例模式
什么是单例模式  单例模式是在程序中,一个类保证只有一个实例,并提供统一的访问入口。为什么要用单例模式节省内存节省计算如对象实例中的一样的,那就不用每次都创建一个对象方便管理因为单例提供一个统一的访问入口,不需要创建N多个对象,很多工具类都用了单例实现,如日志、字符串工具类
Wesley13 Wesley13
3年前
PHP单例模式(精讲)
首先我们要明确单例模式这个概念,那么什么是单例模式呢?单例模式顾名思义,就是只有一个实例。作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类我们称之为单例类。单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例
Stella981 Stella981
3年前
C#设计模式(1)——单例模式(Singleton)
单例模式即所谓的一个类只能有一个实例,也就是类只能在内部实例一次,然后提供这一实例,外部无法对此类实例化。单例模式的特点:1、只能有一个实例;2、只能自己创建自己的唯一实例;3、必须给所有其他的对象提供这一实例。普通单例模式(没有考虑线程安全)  ///<summary///单例模式
Wesley13 Wesley13
3年前
(面试常问)4种单例设计模式的总结(内含代码以及分析)
单例设计模式:  单例模式,是一种常见的软件设计模式.在它的核心结构中只包含了一个被称为单例的特殊类.通过单例模式可以保证系统中只有该类的一个实例对象.优点:  实例控制:单例模式会阻止其它对象实例化其自己的单例对象的副本,从而确保所有对象都访问的是唯一的实例   灵活性:因为类控制了实例化过程,所以类可以很灵活的更改实
Wesley13 Wesley13
3年前
Java设计模式:Singleton(单例)模式
概念定义Singleton(单例)模式是指在程序运行期间,某些类只实例化一次,创建一个全局唯一对象。因此,单例类只能有一个实例,且必须自己创建自己的这个唯一实例,并对外提供访问该实例的方式。单例模式主要是为了避免创建多个实例造成的资源浪费,以及多个实例多次调用容易导致结果出现不一致等问题。例如,一个系统只能有一个窗口管理器或文件系统,一个程
Wesley13 Wesley13
3年前
23种设计模式(1):单例模式
定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。类型:创建类模式类图:!23种设计模式(1):单例模式第1张|快课网(http://static.oschina.net/uploads/img/201407/05200605_0dij.gif"23种设计模式(1):单例模式
比特踏月使
比特踏月使
Lv1
给不了彼此幸福的人是终身都不必再见的人.
文章
4
粉丝
0
获赞
0