乐趣区

关于设计模式:设计模式1单例模式

摘要

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

概念

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

要点

  • 某一个类只能创立一个一个实例
  • 必须类外部自行创立这个实例
  • 必须向零碎提供这个实例,也就是提供一个全局拜访点

长处

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

毛病

  • 扩大艰难,如果要扩大除了批改原来的代码没有第二种开发路径,违反开闭准则
  • 单例模式的性能通常都写在一个类中,如果功能设计不合理,则很容易违反繁多职责准则
  • 并发测试中不好 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 许可协定。转载请注明出处!

退出移动版