单例模式

Posted 每天一篇,坚持...

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例模式相关的知识,希望对你有一定的参考价值。

核心作用:

  保证一个类只有一个对象,并且提供一个访问该实例的全局访问点。

常见应用场景:

  1、windows中的任务管理器就是典型的单例模式

  2、windows回收站也是单例模式

  3、项目中读取配置文件的类也是单例模式

  4、日志管理

  。。。

单例模式的优点:

  1、由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其它依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决

  2、单例模式可以设置全局访问点,优化共享资源的访问,例如可以设计一个单例类,负责所有数据表的映射处理

 

常见的五种单例模式实现方式:

  主要:

    饿汉式:(线程安全,调用效率高。但是不能延时加载)

    懒汉式:(线程不安全,调用效率不高。但是可以延时加载)

  其他:

    双重检测锁式(由于JVM底层内部模型原因,偶尔会出现问题,不建议使用)

    静态内部类式(线程安全、调用效率高。但是可以延时加载)

    枚举单例(线程安全、调用效率高。不能延时加载)

饿汉式

package com.pattern.singleton;

/**
 * 测试饿汉单例模式
 */
public class SingLetonDemo1 {

	//类初始化立即加载,所以叫饿汉式
	//类初始化时,立即加载这个对象(不能延时加载),加载类时,天然的是线程安全的
	private final static SingLetonDemo1 singLetonDemo1 = new SingLetonDemo1();
	
	private SingLetonDemo1() {
	}
	
	//方法没有同步,调用效率高
	public static SingLetonDemo1 getInstance() {
		return singLetonDemo1;
	}
	
}

懒汉式  

package com.pattern.singleton;

/**
 * 测试懒汉单例模式
 */
public class SingLetonDemo2 {
	
	//类初始化时,不初始化这个对象(延时加载,真正用的时候加载)
	private static SingLetonDemo2 singLetonDemo2 = null;
	
	private SingLetonDemo2() {
	}
	
	//方法同步调用效率低
	public static synchronized SingLetonDemo2 getInstance() {
		if(singLetonDemo2 == null) {
			singLetonDemo2 = new SingLetonDemo2();
		}
		return singLetonDemo2;
	}

}

  

 

以上是关于单例模式的主要内容,如果未能解决你的问题,请参考以下文章

常用代码片段

性能比较好的单例写法

片段作为 Android 中的单例

单例片段或保存网页视图状态

你熟悉的设计模式都有哪些?写出单例模式的实现代码

单例模式以及静态代码块