1.目的:使得类的一个对象成为该系统中的唯一实例。
2.定义:一个类有且仅有一个实例,并且自行实例化向整个系统提供。
3.实现:
1.只提供私有的构造方法
2.含有一个该类的静态私有对象(静态修饰的对象,无论实例了多少对象,均共享同一个静态成员)
3.提供一个公有的静态方法,用于创建,获取静态私有对象
4.有两种实现方案
1.饿汉式(对象创建过程中实例化)
2.懒汉式(静态公有方法中实例化)
5.饿汉式的代码实现
package com.imooc.singleton;
public class Singleton {
//1.创建私有构造方法
private Singleton(){
}
//2.创建该类的私有静态实例
private static Singleton instance = new Singleton();
//创建公有静态方法,返回静态实例对象
public static Singleton getInstance(){
return instance;
}
}
package com.imooc.singleton;
public class Test {
public static void main(String[] args) {
Singleton one = Singleton.getInstance();
Singleton two = Singleton.getInstance();
System.out.println(one == two);//true
}
}
6.懒汉式的代码实现
package com.imooc.singleton;
public class SingletonTwo {
//1.私有的构造方法,该类不允许实例化
private SingletonTwo() {
}
//2.私有的静态对象
private static SingletonTwo singletonTwo=null;
//3.公有的静态方法,获取该类的实例
public static SingletonTwo getInstance() {
if (singletonTwo == null) {
singletonTwo = new SingletonTwo();
return singletonTwo;
}else{
return singletonTwo;
}
}
}
7.饿汉式VS懒汉式
- 饿汉式:在类加载时就创建实例,速度快,但耗费空间(空间换时间),线程安全。
- 懒汉式:第一次使用时才进行实例化,虽然速度慢,但只在使用时实例化(时间换空间),并发时存在线程风险,但可以使用同步锁,双重校验锁,静态内部类,枚举等来解决。
8.单例模式的优缺点
优点
- 在内存中只有一个对象,节省内存空间
- 避免频繁的创建销毁对象,提高性能
- 避免对共享资源的多重占用
缺点
- 扩展比较困难
- 如果实例化的对象长期不用,系统将默认为垃圾进行回收,造成对象状态丢失
9.使用场景
- 创建对象占用资源过多,但同时又需要用到该类对象
- 对系统内资源要求统一读写,入读写配置信息
- 对多个实例存在可能引起程序逻辑错误,如号码生成器