摘要
- 简略介绍了什么是单例模式
- 介绍了懒汉式和饿汉式的实现
- 剖析了单例模式呈现的场景
- 用数据库连接池的例子演示了单例模式
概念
确保一个类只能有一个实例,并提供一个全局拜访点来拜访这个实例。
要点
- 某一个类只能创立一个一个实例
- 必须类外部自行创立这个实例
- 必须向零碎提供这个实例,也就是提供一个全局拜访点
长处
- 保障内存中只有一个实例,减小内存开销
- 防止对资源的多重占用
- 设置全局拜访点,优化和共享资源的拜访
毛病
- 扩大艰难,如果要扩大除了批改原来的代码没有第二种开发路径,违反开闭准则
- 单例模式的性能通常都写在一个类中,如果功能设计不合理,则很容易违反繁多职责准则
- 并发测试中不好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 许可协定。转载请注明出处!