网上对设计模式有各种各样的解释和说明
以下写的是自己对单例的理解
单例模式的实现有很多种写法,例如:饿汉,懒汉,双重锁,静态代码块/静态内部类,枚举等,单例即是类只允许提供一个实例对象(有点类似于静态全局变量在不同地方调用,修改的都是同一个变量)用途很广 比如在写连接池工具类的时候 用单例模式保证不会反复new 新的对象,导致连接池爆满.
枚举单例
枚举单例的好处在于线程安全 写法简单,解决了序列化和反射的问题,个人理解本质是一个饿汉式的单例.
public enum EnumSingleton {
//枚举单例模式
INSTANCE;
public void theMethodNeedSingleton(){
//方法
}
}
public class sinletonTest {
//测试类
public static void main(String[] args) {
EnumSingleton a1 = EnumSingleton.INSTANCE;
System.out.println(a1);
EnumSingleton a2 = EnumSingleton.INSTANCE;
System.out.println(a2);
EnumSingleton a3 = EnumSingleton.INSTANCE;
System.out.println(a3);
}
}
运行结果:
INSTANCE
INSTANCE
INSTANCE
Process finished with exit code 0
毫无疑问结果都是一样的 通过EnumSingleton.INSTANCE.theMethodNeedSingleton()调用方法实现单例
一开始举了连接池的例子 就写一个c3p0的实例
public enum JdbcUtil {
INSTANCE;
private final ComboPooledDataSource cs;
JdbcUtil() {
cs = new ComboPooledDataSource("mysql");
}
public DataSource getDataSource() {
return cs;
}
public Connection getConnection() throws SQLException {
return cs.getConnection();
}
}
通过Jdbc.INSTANCE.getDataSource()
拿到连接对象,与其说DatatSourse是单例,不如说由于枚举的特性 INSTANCE是单例,故通过INSTANCE拿到的对象一定也是一个单例