单例模式 定义 (确保一个类只有一个实例 而且自行实例化并向整个系统提供这个实例) 确保一个类中只有一个实例 那么他的构造函数需要时private权限的 并且是在自己的类中自行实例化 (自己new出来的 ) uml类图 单例模式的要点有三个; 一是某个类只能有一个实例; 二是它必须自行创建这个实例; 三是它必须自行向整个系统提供这个实例。 单例模式的优点 1 由于单例模式在整个项目运行中只有一个实例 这样就减少了内存的占用 当一个对象需要频繁的创建 销毁时 创建和销毁的过程又没有办法优化 这个时候单例模式的优势非常明显 2 减少了性能的开销 当一个对像的创建需要 比较多的资源 比如读取配置 产生其他的依赖对象的时候 都可以在系统启动的时候创建一个单例对象 在内存中保存 3 避免对资源的多重占用 单例只有一个对象 比如文件资源的读写操作 由于只有一个对像 避免了对一个文件的同时操作 4 可以设置全局访问 共享资源访问 比如登录的用户 单例模式的缺点 不利于扩展 单例模式没有接口 扩展很难 有需求的变更的时候只能修改代码 代码示例 单列模式 /** * 第一种(懒汉,线程不安全) */ public class WangTeacher { private static WangTeacher instance; private WangTeacher () {} public static WangTeacher getInstance() { if (instance == null) { instance = new WangTeacher(); } return instance; } public static void say() { System.out.println("我是王老师"); } } /** * 第二种(懒汉,线程安全,但是很消耗性能) */ public class QiTeacher { private static QiTeacher instance; private QiTeacher () {} public static synchronized QiTeacher getInstance() { if (instance == null) { instance = new QiTeacher(); } return instance; } public static void say() { System.out.println("我是齐老师"); } } /**. * 第三种(饿汉) */ public class QiaoTeacher { private static QiaoTeacher instance = new QiaoTeacher(); private QiaoTeacher (){} public static QiaoTeacher getInstance() { return instance; } public void say() { System.out.println("我是乔老师"); } } /** * 第四种(饿汉 变种) */ public class LiTeacher { private static LiTeacher instance = null; static { instance = new LiTeacher(); } private LiTeacher (){} public static LiTeacher getInstance() { return instance; } } /** * 第五种(静态内部类) */ public class SunTeacher { private static class SingletonHolder { private static final SunTeacher INSTANCE = new SunTeacher(); } private SunTeacher (){} public static final SunTeacher getInstance() { return SingletonHolder.INSTANCE; } } /** * 双重锁 */ public class ZhangTeacher { private volatile static ZhangTeacher singleton; private ZhangTeacher (){} public static ZhangTeacher getSingleton() { if (singleton == null) { synchronized (ZhangTeacher.class) { if (singleton == null) { singleton = new ZhangTeacher(); } } } return singleton; } } /** * 枚举 */ public enum ZhouTeacher { INSTANCE; public void whateverMethod() { } } |
|