设计模式(单例模式的代码实现)
-
优点
- 在空间中只有一个对象,节省内存空间
- 避免频繁的创建对象销毁对象,提高性能
- 避免对共享资源的多重占用
-
缺点
- 扩展比较困难
- 如果实例化后的对象长期不使用,系统将默认认为垃圾进行回收,造成对象状态丢失
-
使用场景
- 创建对象时占用资源过多,但同时又需要用到该类的对象
- 对系统内资源要求统一读写,入读写配置信息
- 当多个实例存在可能引起程序逻辑错误,如号码生成器
-
饿汉式的代码实现(在类加载时就创建实例)
- 在多线程中是安全的
// 饿汉式:创建对象实例的时候直接初始化 public class SingletonOne { // 创建类中私有构造 private SingletonOne(){} // 创建该类型的私有静态实例 private static SingletonOne instance = new SingletonOne(); // 创建公有静态方法返回静态实例对象 public static SingletonOne getInstance(){ return instance; } }
-
测试
SingletonOne one = SingletonOne.getInstance(); SingletonOne two = SingletonOne.getInstance(); System.out.println(one == two); // true
-
懒汉式的代码实现(以时间换空间,第一次使用时进行初始化)
- 在多线程中存在线程的风险
- 解决方案:同步锁、双重校验锁、静态内部类、枚举
// 懒汉式:类中实例对象创建时并不直接初始化,直到第一次调用 getInstance 时才完成初始化 public class SingletonTwo { // 创建私有构造方法 private SingletonTwo(){} // 创建静态的该类实例对象 private static SingletonTwo instance = null; // 创建公有静态的该类实例对象 public static SingletonTwo getInstance() { if(instance == null) { instance = new SingletonTwo(); } return instance; } }
- 在多线程中存在线程的风险
-
测试
SingletonTwo one = SingletonTwo.getInstance(); SingletonTwo two = SingletonTwo.getInstance(); System.out.println(one == two); // true