单例模式(Singleton Pattern)

网上对设计模式有各种各样的解释和说明
以下写的是自己对单例的理解

单例模式的实现有很多种写法,例如:饿汉,懒汉,双重锁,静态代码块/静态内部类,枚举等,单例即是类只允许提供一个实例对象(有点类似于静态全局变量在不同地方调用,修改的都是同一个变量)用途很广 比如在写连接池工具类的时候 用单例模式保证不会反复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拿到的对象一定也是一个单例

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容