单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
简介
单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。
许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。
实现思路
声明一个本类对象
构造方法私有化
给外部提供一个静态方法获取对象实例 getInstance()
实现方式
饿汉式
在类被加载后,对象被创建,到程序结束后释放
1 | class Singleton_1 { |
懒汉式(线程不安全)
在第一次调用getInstance()方法时,对象被创建,到程序结束后释放
1 | class Singleton_2 { |
懒汉式(线程安全,同步方法)
1 | /** |
还有几种,以后学习到会添加
问题
1. 为什么要使用单例模式,它有什么好处?
在设计一些工具类的时候(通常工具类,只有方法,没有属性)
工具类可能被频繁调用
目的是为了节省重复创建对象带来的内存消耗,从而提高效率
2. 能不能使用构造方式私有化加上静态方法来代替单例呢
两种方式各有特点,在Java的JDK中Math类就是静态类来实现的,而java.lang.Runtime是一个单例的类
由于是静态方法,程序运行时就已经被加载到静态方法区中,这样调用的时候就可以直接从静态方法区中读取,速度很快,不过占用内存较高。
单例中的方法,归根结底还是普通方法,方式的执行需要依赖对象,方法运行时需要进栈,运行结束后出栈,这样在内存中只占一个对象的空间,对内存比较节省
如果是一个非常重的对象,单例可以懒加载,但是静态类没有这样的优势,并且非常热切的加载。
使用单例,可以通过继承和多态扩展基类,实现接口和更有能力提供不同的实现,如果我们讨论java.lang.Runtime,在Java中它是单例,调用getRuntime()方法,会基于不同的JVM返回不同的实现,但也保证了每个JVM中实有一个实例,如果java.lang.Runtime是一个静态类,不太可能因不同的JVM返回不同的实现。
这就是Java中单例与静态类的区别,当你需要一个全OO能力的对象时,选择单例,如果仅仅是将一些静态方法预售,使用静态类。