设计模式之单例模式篇
十九世纪八十年代,中国开始了计划生育。而单例模式也是保证一个类只有一个实例,提供一个访问该实例的全局变量。和计划生育是不是也异曲同工之妙呢? 单例模式常见的场景有Windows Task Manager(任务管理器)、Windows Recycle Bin(回收站)、一般数据库连接池使用的单例模式、在读取配置文件时也常采用单例模式。
优点和实现
优点:单例模式只生成一个实例,减少了系统性能开销;可以在系统设置全局访问点,优化环共享资源访问。
实现:
1. 饿汉式
2. 懒汉式
3. 双重检测琐式
4. 静态内部类式
5. 枚举;
*饿汉式 *
饿汉式线程安全 ,调用效率高,但是不能延时加载,在类装载时 就加载了对象。
package com.xiaoxin.shejimushi;
/**
* 单例模式@饿汉式
* @author xiaoxin
* hunanxiaoxin@126.com
*/
public class SingLetonDemo1 {
//类装载时 ,即加载对象(不能延时加载)。
private static SingLetonDemo1 instance = new SingLetonDemo1();
//构造方法私有化
private SingLetonDemo1 (){
}
//提供一个getInstance方法。该方法没有同步 调用效率高。
public static SingLetonDemo1 getInstance(){
return instance;
}
}
懒汉式
懒汉式在需要时才创建对象,实现了延时加载,同样线程是安全的,但是调用效率不高。
- 单例模式@懒汉式
- @author xiaoxin
- hunanxiaoxin@126.com
*/
public class SingLetonDemo2 {
private static SingLetonDemo2 instance;
//构造方法私有化
private SingLetonDemo2 (){
}
//提供一个getInstance方法。synchronized实现同步,每次创建即需同步,所以调用效率不高。
public static synchronized SingLetonDemo2 getInstance(){
if(instance==null){
instance = new SingLetonDemo2(); //在需要用时,再创建对象 实现延时加载 。
}
return instance;
}
}
双重检测锁式
一般不建议使用,了解。(本人第一次写博客,希望各位提供意见,我将仔细聆听)
在这里插入代码片
/*
- 单例模式@双重检测琐式
- @author xiaoxin
- hunanxiaoxin@126.com
*/
public class SingLetonDemo3 {
private static SingLetonDemo3 instance = null;
public static SingLetonDemo3 getInstance(){
if(instance == null){
SingLetonDemo3 s;
synchronized (SingLetonDemo3.class){
s = instance;
if(s == null){
synchronized (SingLetonDemo3.class){
if(s == null){
s = new SingLetonDemo3();
}
}
instance = s;
}
}
}
return instance;
}
private SingLetonDemo3 (){
}
}
静态内部类
可以延迟加载,在需要时调用SingLetonInstance.instance
/**
* 单例模式@静态内部类
* @author xiaoxin
* hunanxiaoxin@126.com
*/
public class SingLetonDemo4 {
private static class SingLetonInstance{
private static final SingLetonDemo4 instance = new SingLetonDemo4();
}
private SingLetonDemo4(){
}
public static SingLetonDemo4 getInstance(){
return SingLetonInstance.instance;
}
}
枚举
实现简单,枚举本身就是单例模式,不可以延迟加载。
/**
* 单例模式@枚举
* @author xiaoxin
* hunanxiaoxin@126.com
*/
public enum SingLetonDemo5 {
instance;
public void singletonOpration(){
}
}
总结
第一次写博客有错误的地方勿怪。