一、单例模式
是一种创建模式,这种模式只设计一个单独的类,它负责创建自己的对象。
1.有且只有一个实例对象
2.必须自行创建实例--
3.必须自行向整个系统提供这个实例
1.只提供私有的构造方法
2.含有一个该类的私有静态实例
3.提供一个公有的静态方法用于创建、获取静态私有对象
实现单例模式的两种方法:
public class SingletonOne {
/**
* 创建一个私有的构造方法
*/
private SingletonOne() {
}
/**
* 提供一个该类私有的静态实例
*/
private static SingletonOne instance = new SingletonOne();
/**
* 提供一个公有的静态方法返回静态实例对象
*/
public static SingletonOne getInstance() {
return instance;
}
}
在实例化该类私有的静态实例时,可以先设置为null,在提供公共静态方法时再实例化。
第一种方法是空间换时间 第二种是属于时间换空间;
private static SingletonOne instance =null;
public static SingletonOne getInstance(){
if(instance==null){
instance= new SingletonOne();
}
return instance;
}
测试类中打印
public class SingletonTest {
public static void main(String[] args) {
// 这种调用方式会报错 因为静态实例被设置为private
// SingletonOne one = new SingletonOne();
SingletonOne one = SingletonOne.getInstance();
SingletonOne two = SingletonOne.getInstance();
System.out.println(one==two);
}
}
二、单例模式的优点和缺点
优点
1.在内存中只有一个对象,节省内存空间
2.避免频繁的创建和销毁,提高性能
3.避免对公共资源的占用
缺点
1.扩展比较困难
2.如果实例化后对象长期不用,系统将默认为垃圾进行回收,造成对象状态丢失
三、单例模式适用场景
1.创建对象时占用资源过多,但同时又需要用到该类对象
2.对系统内资源要求统一读写,如读写配置信息
3.当多个实例存在可能引起程序逻辑错误,如号码生成