设计模式之单例模式

来源:互联网 发布:psv重构数据库365 编辑:程序博客网 时间:2024/06/05 07:26
什么是单例?
 
单例对象的类必须保证只有一个实例存在

懒汉式:指全局的单例实例在第一次被使用时构建。
饿汉式:指全局的单例实例在类装载时构建。

单例模式之饿汉式
public class Singleton {
private static final Singleton instance = new Singleton();

private Singleton() {
}

public static Singleton getInstance() {
return instance;
}
}
此写法实现简单,也避免了同步问题,但是不是懒加载(lazy initialization),在需要实例之前就完成了初始化,如果需要给getInstance()函数传入参数,则无法实现。


单例模式之懒汉
public class Singleton {
private static Singleton instance;

private Singleton() {
}

public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
此写法没有同步,所以线程不安全。


单例模式之懒汉(线程安全)
public class Singleton {
private static Singleton instance;

private Singleton() {
}

public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
此写法效率低下,对象只需要在初始化时需要同步,大部分情况下不需要互斥的获得对象。


单例模式之懒汉双重校验
public class Singleton {
private volatile static Singleton instance;

private Singleton() {
}

public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
将instance声明为volatile很有必要,保证变量的可见性,但不保证原子性,所以还需要synchronized。


单例模式之静态内部类
public class Singleton {
private Singleton() {
}

private static class SingletonHolder {
private static final Singleton INSTACNCE = new Singleton();

public static final Singleton getInstance() {
return SingletonHolder.INSTACNCE;
}
}
}
此写法既实现了懒加载,也同时保证了安全。


单例模式之枚举
public enum Singleton {
instance;

public void whateverMethod() {
}
}
此写法除了没有懒加载之外算是全场最佳了,枚举语法我也只是刚刚接触,所以就不多解释了。



参考:
http://www.cnblogs.com/dongyu666/p/6971783.html
http://www.cnblogs.com/hupp/p/4487521.html
http://blog.csdn.net/goodlixueyong/article/details/51935526
原创粉丝点击